2012-04-28 19 views
6

Vengo de un fondo de C++ y me preguntaba sobre las características inmutables de Java. ¿Pueden los valores devueltos de las funciones especificarse como const? (Es decir, el valor devuelto no se puede modificar)Valores de retorno de Const en Java

También para puntos de bonificación, en C++ una definición de función se puede postfix'ed como const para indicar que la función no modificará los valores de nivel de clase. ¿Esto también es posible en Java? (lo que significa que una función, por definición, no podrá cambiar su estado de clase internamente)

¡Muchas gracias!

+1

No vale la pena que en Java sea mucho más difícil tener efectos secundarios con el lenguaje es mucho más simple, por lo que no tiene que dar los mismos consejos para la optimización del código. –

+0

posible duplicado de [¿Por qué no hay palabra clave constante en Java?] (Http://stackoverflow.com/questions/2735736/why-is-there-no-constant-keyword-in-java) –

Respuesta

6

No, Java final es muy diferente a C++ 's const. No puedes hacer ninguna de las cosas que pediste.

Para hacer que un objeto sea inmutable, es más o menos depende de usted hacer cumplir (en lugar de alistar la ayuda del compilador como en C++). De http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html:

Las siguientes reglas definen una estrategia simple para crear objetos inmutables. ...

  1. No proporcione métodos "setter": métodos que modifican campos u objetos a los que se hace referencia por campos.
  2. Realice todos los campos final y private.
  3. No permita que las subclases anulen los métodos. La forma más sencilla de hacerlo es declarar la clase como final. Un enfoque más sofisticado es crear el constructor private y construir instancias en los métodos de fábrica .
  4. Si los campos de instancia incluyen referencias a objetos mutables, no permiten que estos objetos sean cambiados:
    • No proporcione métodos que modifican los objetos mutables.
    • No comparta referencias a los objetos mutables. Nunca almacene referencias a objetos externos y mutables pasados ​​al constructor; si es necesario , cree copias y almacene referencias a las copias. De manera similar, cree copias de sus objetos mutables internos cuando sea necesario para evitar devolver los originales en sus métodos.
+3

wow ...eso es terrible. Debe ser mucho trabajo en Java para proteger el estado y tal. Gracias por la respuesta del fin de semana! –

+0

@JonathanDunlap Creo que la forma de proteger el estado es devolver un Objeto nuevo que es esencialmente una copia de lo que desea devolver. – Troyseph

1

No, en realidad no hay manera de crear objetos inmutables fuera de lugar. Si quieres algo inmutable, tiene que ser inmutable (final) a lo largo de todo el árbol.

p. Ej. el siguiente ejemplo se utiliza final en cada lugar (a excepción de la raíz), pero todavía no es capaz de impedir cualquier cambio:

public class justAnInt { 
    public int a = 0; 
    public int b = 0; 
} 

// ----------------------------------- 

public class AliasProblem{ 
    private final justAnInt var = new justAnInt(); 
    final justAnInt getVar() 
    { 
     return var; 
    } 

    public static void main(String argv[]) 
    { 
     final AliasProblemObject = new AliasProblem(); 
     final justAnInt localVar = AliasProblemObject.getVar(); 
     localVar.a = 19; 
     System.out.println("object: " + object.getVar().a); 
     System.out.println("local: " + localVar.a); 
    } 

} 
0

Creo que se puede volver copia de datos de objetos para la lectura y por lo tanto, protegerlos de ser modificado. Pero una copia extra parece ser un gran precio por ser inmutable.

Cuestiones relacionadas