你知道我怎样才能在一个特殊的类中改变一个对象?
在这个例子中,我希望对象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
类的朋友。
答案 0 :(得分: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();
}
}
现在,您无法从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关键字。但是,有许多应用程序级别的替代方案:
increment()
类的PrivateObject
方法声明为package-private,并在同一个包中定义Box。OR
2.让调用代码将一个标记传递给increment()
- 在此方法中检查此标记是否确实来自Box
类并允许或禁止。
我们的想法是保持PrivateObject
和Box
类之间的耦合可管理。
答案 3 :(得分:2)
在Java中,您可以通过将多个类放在同一个包中来创建一组“朋友”。然后,对要限制访问的类,方法和字段使用默认范围(无访问说明符)。