2012-06-01 10 views
6

Sai ragazzi come posso rendere un oggetto modificabile solo all'interno di una classe speciale? In questo esempio voglio che l'oggetto PrivateObject sia solo modificabile (incrementabile) all'interno della classe Box, da nessun'altra parte. C'è un modo per ottenere questo?java -like amico meccanismo di classe

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++, vorrei fare tutte le proprietà ei metodi PrivateObject privata, e il dichiarare la classe Box come un amico per la classe PrivateObject.

+1

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

risposta

3

Seè strettamente correlato a Box perché non renderlo una classe interna all'interno di 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(); 
    }  
} 

Ora non è possibile chiamare increment dall'esterno Box:

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

Il più vicino sarebbe quello di rendere PrivateObject una classe interna di Box e fare increment privato. In questo modo, il metodo sarà accessibile solo all'interno della classe 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++; 
     } 
    } 
} 

Se non si vuole fare questo, l'opzione successiva potrebbe essere quella di rendere increment pacchetto privato e individuare le 2 classi nello stesso package. In questo modo, solo le classi all'interno di quel pacchetto avranno accesso a quel metodo. Ma questo potrebbe includere classi diverse da Box.

3

Java non ha alcuna funzionalità linguistica equivalente alla parola chiave amico di C++. Tuttavia, ci sono numero di alternative a livello di applicazione:

  1. dichiarare il metodo della classe PrivateObjectincrement() come pacchetto- privato e definire Box nella stessa confezione.

O

2.Let codice chiamante passa un gettone nella increment() - all'interno di questo metodo di controllo se questo blocco è infatti proviene Box classe e consentire o meno.

L'idea è di mantenere l'accoppiamento tra PrivateObject e Box di classe gestibile.

1

In Java, si crea un gruppo di "amici" inserendo più classi nello stesso pacchetto. Quindi, usa l'ambito di default (senza identificatore di accesso) sulle classi, i metodi e i campi a cui vuoi limitare l'accesso.

Problemi correlati