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
类的朋友。
如果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 }
最接近的是使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。 但是,有许多应用程序级别的替代方案:
- 将
PrivateObject
类的increment()
方法声明为package-private,并在同一个包中定义Box。
要么
2.让调用代码将一个标记传递给increment()
– 在此方法中检查此标记是否确实来自Box
类并允许或禁止。
我们的想法是保持PrivateObject
和Box
类之间的耦合可管理。
在Java中,您可以通过将多个类放在同一个包中来创建一组“朋友”。 然后,对要限制访问的类,方法和字段使用默认范围(无访问说明符)。