2012-03-16 14 views
39

Actualmente estoy leyendo "concurrencia de Java en la práctica", que contiene esta frase:¿Qué es un objeto sin estado en Java?

Desde la acción de un hilo para acceder a un objeto sin estado no puede afectar a la exactitud de las operaciones en otros hilos, objetos sin estado se a salvo de amenazas.

Entonces, ¿qué es un objeto sin estado?

Respuesta

63

El objeto sin estado es una instancia de una clase sin campos de instancia (variables de instancia). La clase puede tener campos, pero son constantes de tiempo de compilación (estática final).

Un término muy relacionado es inmutable. Los objetos inmutables pueden tener estado, pero no cambian cuando se invoca un método (las invocaciones de método no asignan nuevos valores a los campos). Estos objetos también son seguros para subprocesos.

+14

Si un objeto tiene un campo (no estático), tiene un estado. Si es inmutable, tiene exactamente un estado, pero no es sin estado. – assylias

+0

@assylias Acabo de arreglar esa – Bozho

+0

@ la respuesta de om-nom-nom toca mucho en profundidad. – user2351818

2

un objeto sin estado, como variables de instancia que pueden cambiar y variar dependiendo de lo que ya ha ocurrido con el objeto

38

Si el objeto no tiene ningún campos de instancia, que se sin estado. También puede ser apátrida si tiene algunos campos, pero sus valores son conocidos y no cambian.

Este es un objeto sin estado:

class Stateless { 
    void test() { 
     System.out.println("Test!"); 
    } 
} 

Este es también un objeto sin estado:

class Stateless { 
    //No static modifier because we're talking about the object itself 
    final String TEST = "Test!"; 

    void test() { 
     System.out.println(TEST); 
    } 
} 

Este objeto tiene estado, por lo que es no sin estado. Sin embargo, se ha establecido una sola vez su estado, y no cambiar más adelante, este tipo de objetos se llama inmutable:

class Immutable { 
    final String testString; 

    Immutable(String testString) { 
     this.testString = testString; 
    } 

    void test() { 
     System.out.println(testString); 
    } 
} 
+1

"tiene algunos campos, pero se sabe que nunca cambian". Eso sería inmutable, no apátrida – assylias

+1

@assylias No necesariamente. Si estos campos son constantes y se configuran en tiempo de compilación, siempre conoceremos sus valores. Esto significa que el objeto no contiene ninguna información de estado. – Malcolm

+1

Los objetos sin estado no tienen estado. Los objetos inmutables con campos no pueden pasar a un estado diferente del que se crearon, por lo que tienen exactamente un estado. – assylias

1

Un objeto sin estado es un objeto que no tiene ningún estado interno (variable interna)

0

Objetos que no tienen absolutamente ningún estado, entonces no hay ningún problema al reutilizarlos en este punto la pregunta es: si no tienen absolutamente ningún estado, ¿por qué no hacer todos los métodos estáticos y nunca crear ninguno?

+0

"si no tienen absolutamente ningún estado, ¿por qué no hacer todos los métodos estáticos y nunca crear uno en absoluto?" ---- Debemos tener en cuenta el polimorfismo. O simplemente tenga en cuenta la regla de OO: 'separar la implementación del abstracto'. Es común en el diseño de OO que tengamos una interfaz que represente una abstracción, mientras que podemos tener varias implementaciones ---- clases que implementen nuestra interfaz. En este caso, incluso si la clase implementadora es apátrida, una clase con solo métodos estáticos NO funciona, ya que no puede implementar nuestra interfaz. – user2351818

2

El concepto de objeto sin estado está muy acoplado con el concepto de side effects. En breve, ese es el objeto que no tiene campos debajo que podrían tener diferentes valores, dependiendo del diferente orden de las llamadas a métodos.

1

Solo una aclaración. Puede considerar su clase como apátrida en la forma que se establece anteriormente, incluso cuando tiene una variable de instancia en la medida en que esta variable es final E inmutable.

Si la variable de instancia es solo final pero mutable, una lista de cadenas en el ejemplo, sí, la referencia de la variable no se puede cambiar pero se puede cambiar el contenido de la lista y el estado de la clase.

0

Si no puede cambiar ningún parámetro o valor, etc.de un objeto, después de su creación, entonces ese objeto es seguro para subprocesos.