Pregunta

Cuando paso un tipo de objeto inmutable (String, Integer, ..) como final a un método que puede lograr los caracteres de puntero constante a C ++. Pero ¿cómo puedo cumplir este tipo de comportamiento en los objetos que son mutables?

public void someMethod(someType someObject){
 /*
  * code that modifies the someObject's state
  * 
  */
}

Lo único que quiero es evitar que algunMetodo de modificar el estado de someObject sin hacer ningún cambio en SomeType. ¿Es esto posible?

¿Fue útil?

Solución

No, no creo que esto es posible. La aproximación normal es crear un adaptador para SomeType donde todos los métodos de cambiar el estado lanza UnsupportedOperationException. Esto es utilizado por, por ejemplo, java.util.Collections.unmodifiable * -Funciones.

Hay varios enfoques para esto:

  • puede dejar que SomeType sea una interfaz, y cuando es necesario que sea de sólo lectura, basta con crear un envoltorio delegar todos los-métodos de lectura al objeto original y ejecutar todas las cancelaciones de métodos para lanzar una excepción.
  • o puede crear una subclase de SomeType anulando todos los métodos de escritura

Esta opción sólo se dan en tiempo de ejecución de cheques, no en tiempo de compilación. Si desea que en tiempo de compilación, puede dejar que SomeType ser una interfaz (o una superclase) sin escribir-métodos, sólo lectura.

Otros consejos

En el caso general, no, no es posible. En un caso muy limitado, se puede envolver SomeType en una clase que proporciona la misma interfaz (ver Collections.unmodifiableList () para un ejemplo).

Sin embargo, no hay equivalente a "pasar un puntero const y el compilador sólo le permitirá llamar a funciones const en él".

No, no se puede evitar que el objeto que está siendo modificado a través de su setXXX () (o similares) métodos. Se podría entregar un clon o una copia del mismo, sin embargo.

No, no es posible. Usted tiene que pasar ya sea en una copia del objeto, o simplemente confiar en saber qué acciones hacen cambios de estado en el objeto y evitar llamar a ellos -. El compilador no le ayudará

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top