C ++ - 就像Java中的友元类机制一样

时间:2012-06-01 10:09:59

标签: java friend

你知道我怎样才能在一个特殊的类中改变一个对象? 在这个例子中,我希望对象PrivateObject只能在Box类内部进行可更改(可递增),而不是其他任何地方。有没有办法实现这个目标?

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 don't want it to be changeable outside the Box class!

在C ++中,我会将所有PrivateObject属性和方法设为私有,并将Box类声明为PrivateObject类的朋友。

4 个答案:

答案 0 :(得分:3)

如果PrivateObjectBox密切相关,为什么不将其作为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();
    }       
}

现在,您无法从increment以外的地方拨打Box

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

答案 1 :(得分:3)

最接近的是使PrivateObject成为Box的内部类,并将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以外的其他类。

答案 2 :(得分:3)

Java没有任何语言功能等同于C ++的friend关键字。但是,有许多应用程序级别的替代方案:

  1. increment()类的PrivateObject方法声明为package-private,并在同一个包中定义Box。
  2. OR

    2.让调用代码将一个标记传递给increment() - 在此方法中检查此标记是否确实来自Box类并允许或禁止。

    我们的想法是保持PrivateObjectBox类之间的耦合可管理。

答案 3 :(得分:2)

在Java中,您可以通过将多个类放在同一个包中来创建一组“朋友”。然后,对要限制访问的类,方法和字段使用默认范围(无访问说明符)。