Instancia (informática)

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda

En el paradigma de la orientación a objetos, una instancia (en inglés, instance) se refiere a una realización específica de una clase o prototipo determinados.

En general, cuando se ejecuta un programa en un computador, se dice que éste se instancia. En lenguajes que crean objetos a partir de clases, un objeto es una instancia de una clase. Esto es, un miembro de una clase que tiene atributos en lugar de variables. En un contexto del mundo real, podríamos pensar en "Perro" como una clase y en un perro concreto es una instancia de esta clase.[1] En este caso no nos importa la raza del perro. Si fuese de nuestro interés modelarla, y diferenciásemos entre un dóberman y un chihuahua, no solo cada instancia sería diferente, sino que pertenecerían a clases o prototipos diferentes, c.f. herencia (informática).

Etimología[editar]

El término en informática procede del inglés, en donde instance viene del significado que podría traducirse por caso o ejemplo en castellano. Aunque la palabra existe en el idioma inglés por incorporación desde el latín como instantia (que es de donde lo hace también la palabra en castellano), pero posteriormente también adquirió (del latín también) parte de la semántica de instāns, que en nuestro caso derivó únicamente en instante.[2] Esta incorporación desde el inglés tendría la consideración de préstamo semántico, aunque esta acepción no está contemplada todavía por la Real Academia Española.[3]

Programación basada en clases[editar]

En este apartado hablaremos de la programación orientada a objetos basada en clases, que es la que implementa la mayoría de lenguajes de programación orientados a objetos. En el modelo basado en prototipos, que es el de lenguajes como JavaScript, los términos que se refieren a clases han de sustituirse por los prototipos de los objetos, pero por lo demás, son de aplicación similar.

En este modelo, un objeto tiene una referencia a la clase a la que pertenece y, por tanto, puede llamar a los métodos de instancia que hayan sido declarados como de instancia, así como a todos aquellos que hayan sido heredados por la jerarquía de herencia estática entre clases.

Ciertos lenguajes de programación permiten utilizar clases mixin, que permiten además realizar asociaciones entre instancias de objetos para establecer relaciones similares a la herencia en tiempo de ejecución.

Clases como objetos[editar]

Multitud de lenguajes de programación basados en clases proporcionan mecanismos de reflexión o introspección, esto es, permiten que el programa pueda observar (e incluso modificar) su propia estructura de alto nivel. Si estos mecanismos siguen el paradigma de orientación a objetos también, entonces las clases serán representadas también como instancias de objetos. En particular, si el lenguaje no permite dos definiciones de una misma clase (puede hacerlo para permitir ejecuciones concurrentes de distintas versiones de una clase)[Nota 1] entonces las clases serán representadas utilizando un Singleton. En Java, por ejemplo, si tenemos una clase definida como:

 public class Perro {}

Podremos acceder a la instancia que representa la clase (y es una instancia de la clasejava.lang.Class<Perro>), en un programa principal de clase Main, del siguiente modo:

 public class Main {
   public static void main(String... args) {
     Class<?> perroClass = Perro.class;
 
     System.out.println(perroClass);   }
 }

Programación basada en prototipos[editar]

En el estilo de programación orientada a objetos basada en prototipos las instancias son los objetos creados a partir de los prototipos. En general, los prototipos también son objetos creados a partir de otros prototipos, con lo que las propiedades y métodos se heredan en la profundidad completa del árbol de herencia de prototipado.

En el caso particular de JavaScript, aunque no se puede cambiar el prototipo de un objeto una vez instanciado, sí se pueden cambiar las propiedades y métodos que tiene el prototipo, afectando a todas las instancias (en profundidad) de ese prototipo. En el caso particular de este lenguaje, en el que todos los objetos son instancias de Object, modificar o añadir métodos a Object tendrá como consecuencia la modificación de esos métodos u objetos entodos los demás objetos que no los hayan redefinido posteriormente, incluyendo los ya instanciados. Este es el mecanismo que utilizan algunas bibliotecas de JavaScript[Nota 2] para proporcionar funciones que no hayan implementado ciertos motores a ciertos objetos del lenguaje.

Notas[editar]

  1. Erlang, por ejemplo, permite la ejecución concurrente de varias versiones de un mismo programa, véase change-3 http://www.erlang.org/doc/man/gen server.html#Module:code change-3, y CLOS.
  2. http://augmentjs.com, por ejemplo, proporciona métodos al objeto Array.prototype, cambiando todos los Array del programa.

Referencias[editar]