6

你知道我怎样才能让一个对象只能在一个特殊的类中改变吗?在此示例中,我希望对象 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

4 回答 4

3

如果与为什么不把它变成一个内部类里面PrivateObject有很强的关系呢?BoxBox

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     
}
于 2012-06-01T10:16:11.823 回答
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 以外的类。

于 2012-06-01T10:16:18.577 回答
3

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

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

或者

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

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

于 2012-06-01T10:18:06.873 回答
2

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

于 2012-06-01T10:20:25.040 回答