2012-06-01 14 views
6

Kennen Sie Jungs, wie kann ich ein Objekt nur innerhalb einer speziellen Klasse veränderbar machen? In diesem Beispiel möchte ich das Objekt PrivateObject nur innerhalb der Box-Klasse änderbar (inkrementierbar), nirgendwo anders. Gibt es einen Weg, dies zu erreichen?java -ähnlicher Freund Klassenmechanismus

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! 

In C++, würde ich alle privaten PrivateObject Eigenschaften und Methoden machen, und die die Box-Klasse als Freund für die PrivateObject Klasse deklarieren.

+1

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

Antwort

3

Wenn PrivateObject stark mit Box zusammenhängt, warum nicht eine innere Klasse innerhalb Box machen?

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(); 
    }  
} 

Jetzt können Sie nicht increment von außen Box nennen:

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

Die nächstgelegene PrivateObject eine innere Klasse von Box zu machen wäre und increment privat machen. Auf diese Weise wird die Methode nur innerhalb der Klasse Box zugänglich sein.

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++; 
     } 
    } 
} 

Wenn Sie das nicht tun wollen, wäre die nächste Option increment Paket privat und suchen Sie die 2 Klassen im gleichen Paket zu machen. Auf diese Weise haben nur Klassen innerhalb dieses Pakets Zugriff auf diese Methode. Aber das könnte andere Klassen als Box beinhalten.

3

Java verfügt über kein Sprachfeature, das dem Friend-Schlüsselwort von C++ entspricht. Allerdings gibt es eine Reihe von Anwendungsebene Alternativen:

  1. Deklarieren Sie die increment() Methode der PrivateObject Klasse als Paket- privaten und definiert Box im gleichen Paket.

ODER

2.Let der anruf Code übergeben Sie einen Token in increment() - innerhalb dieser Methode zu überprüfen, ob dieses Token in der Tat von Box Klasse kommt und erlauben oder zu verbieten. Die Idee ist, die Kopplung zwischen PrivateObject und Box Klasse überschaubar zu halten.

1

In Java würden Sie eine Gruppe von "Freunden" erstellen, indem Sie mehrere Klassen in dasselbe Paket einfügen. Verwenden Sie dann den Standardbereich (kein Zugriffsspezifizierer) für die Klassen, Methoden und Felder, auf die Sie den Zugriff beschränken möchten.