2012-06-01 15 views
6

¿Sabes chicos cómo puedo hacer que un objeto se pueda cambiar solo dentro de una clase especial? En este ejemplo, quiero que el objeto PrivateObject sea solo modificable (incrementable) dentro de la clase Box, en ningún otro lugar. ¿Hay alguna manera de ganar esto?java -like friend class mechanism

public class Box { 

    private PrivateObject prv; 

    public void setPrivateObject(PrivateObject p){ 
     prv = p; 
    } 

    public void changeValue(){ 
     prv.increment(); 

    } 

} 


public class PrivateObject { 
    private value; 
    public increment(){ 
     value++; 
    } 

} 

PrivateObject priv = new PrivateObject(); 
Box box = new Box(); 
box.setPPrivateObject(priv); 
box.changevalue(); 
priv.increment(); //i dont want it to be changable outside the Box class! 

En C++, me gustaría hacer todas las propiedades y métodos PrivateObject privado y el declarar la clase Box como un amigo para la clase PrivateObject.

+1

pregunta relacionada http://stackoverflow.com/questions/182278/is-there-a-way-to-simulate-the-c-friend-concept-in-java –

Respuesta

3

Si PrivateObject está estrechamente relacionado con Box ¿por qué no convertirlo en una clase interna dentro de Box?

class Box { 

    public static class PrivateObject { 
     private value; 

     private increment(){ 
     value++; 
     } 
    } 

    private PrivateObject prv; 

    public void setPrivateObject(PrivateObject p){ 
     prv = p; 
    } 

    public void changeValue(){ 
     prv.increment(); 
    }  
} 

Ahora no se puede llamar desde fuera incrementBox:

public static void main(String args[]) { 
    Box.PrivateObject obj = new Box.PrivateObject(); 
    Box b = new Box(); 
    b.setPrivateObject(obj); 
    obj.increment(); // not visible  
} 
3

Lo más cercano sería hacer PrivateObject una clase interna de la caja y hacer increment privado. De esta forma, el método será accesible solo dentro de la clase Box.

public class Box { 

    private PrivateObject prv; 

    public void setPrivateObject(PrivateObject p) { 
     prv = p; 
    } 

    public void changeValue() { 
     prv.increment(); 

    } 

    public static class PrivateObject { 

     private int value; 

     private void increment() { 
      value++; 
     } 
    } 
} 

Si no quieres hacer eso, la siguiente opción sería hacer increment paquete privado y localizar las 2 clases en el mismo paquete. De esta forma, solo las clases dentro de ese paquete tendrán acceso a ese método. Pero eso podría incluir clases distintas de Box.

3

Java no tiene ninguna característica de idioma equivalente a la palabra clave de amigo de C++. Sin embargo, hay una serie de alternativas a nivel de aplicación:

  1. declarar el método de la clase PrivateObjectincrement() como paquete- privado y definen la caja en el mismo paquete.

O

2.Let el código de llamada pasar un token en increment() - dentro de esta comprobación método si esta señal es de hecho viene de Box clase y permitir o no.

La idea es mantener el acoplamiento entre PrivateObject y Box clase manejable.

1

En Java, crearía un grupo de "amigos" colocando varias clases en el mismo paquete. Luego, use el alcance predeterminado (sin especificador de acceso) en las clases, métodos y campos a los que desea restringir el acceso.