2012-06-01 6 views
6

私はオブジェクトを特別クラス内でのみ変更可能にする方法を知っていますか? この例では、私はオブジェクトPrivateObjectがBoxクラス内でのみ変更可能(増分可能)であることを望みます。これを得る方法はありますか? javaのような友人クラスのメカニズム

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! 

は、C++では、私はすべてのPrivateObjectのプロパティとメソッドをプライベートになるだろう、とPrivateObjectクラスのフレンドとしてBoxクラスを宣言します。

+1

関連するhttp://stackoverflow.com/questions/182278/is-there-a-way-to-simulate-the-c-friend-concept-in-java –

答えて

3

PrivateObjectはと関連の強いですBoxなぜ内部クラスにしないでください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(); 
    }  
} 

今、あなたは外Boxからincrementを呼び出すことはできません。

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

最も近いPrivateObjectボックスの内部クラスにし、incrementをプライベートにすることです。この方法では、メソッドは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++; 
     } 
    } 
} 

あなたがそれを行うにはしたくない場合は、次のオプションがincrementパッケージをプライベートにすることと同じパッケージ内に2つのクラスを探します。そうすれば、そのパッケージ内のクラスだけがそのメソッドにアクセスできます。しかし、それはBox以外のクラスを含むかもしれません。

3

Javaには、C++の友人キーワードに相当する言語機能はありません。

  1. がパッケージ - プライベートとしてPrivateObjectクラスのincrement()メソッドを宣言し、同じパッケージにボックスを定義します。ただし、アプリケーションレベルの選択肢がいくつかあります。このトークンが実際にBoxクラスから来て許可または禁止されている場合は、この方法のチェックの内側 -

OR

2.Let呼び出し元のコードがincrement()にトークンを渡します。

考えられるのは、PrivateObjectBoxの間のカップリングを管理しやすいようにすることです。

1

Javaでは、複数のクラスを同じパッケージに入れることで、「友人」のグループを作成します。次に、アクセスを制限するクラス、メソッド、およびフィールドで、デフォルトのスコープ(アクセス指定子なし)を使用します。

関連する問題