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

C++-就像Java中的朋友类机制一样,java,friend,Java,Friend,你知道我怎样才能使一个对象只在一个特殊的类中变化吗? 在本例中,我希望对象PrivateObject仅在框类中可更改(可增加),而不是在其他地方。有没有办法做到这一点 public class Box { private PrivateObject prv; public void setPrivateObject(PrivateObject p){ prv = p; } public void changeValue(){

你知道我怎样才能使一个对象只在一个特殊的类中变化吗? 在本例中,我希望对象PrivateObject仅在
类中可更改(可增加),而不是在其他地方。有没有办法做到这一点

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++中,我将使所有的<代码>私有对象属性和方法私有,并声明<代码>框<代码>类作为<代码>私有对象Ob/C>类的朋友。 如果
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();
    }       
}
现在您不能从
框的外部调用
增量

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

最接近的方法是使PrivateObject成为Box的内部类,并使
increment
private。这样,该方法将只能在
类中访问

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
package设置为私有,并在同一个包中定位这两个类。这样,只有该包中的类才能访问该方法。但这可能包括Box以外的类。

Java没有任何与C++的friend关键字等价的语言特性。但是,有许多应用程序级备选方案:

  • PrivateObject
    类的
    increment()
    方法声明为同一个包中的package-private和define框
  • 2.让调用代码将令牌传递到
    increment()
    -在该方法中检查该令牌是否确实来自
    类,并允许或不允许


    其思想是保持
    PrivateObject
    Box
    类之间的耦合可管理。

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

    相关问题