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

你知道我怎样才能在一个特殊的类中改变一个对象? 在这个例子中,我希望对象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类的朋友。

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

现在你不能从外面的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 } 

最接近的是使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以外的类。

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

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

要么

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

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

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