有没有办法让 Class A 的变量只被特定接口的 类 修改?

Is there any way to make variables of Class A being only modified by classes of a particular interface only?

Class A {
   String x;
}

我有两个接口 I1 和 I2。

Class C1 实现 I1

Class C2 实现 I2

有没有办法只允许Class C2更新Class A的x?即有没有什么方法可以让 classes 实现一个特定的接口来更新 Class A 的成员?

Classes 实现 I1 应该只能读取 class A 的成员,并且不应允许它们更新 class A 的成员。

虽然这看起来像是一个设计错误,但您仍然可以通过使用 setter 中的 instanceofxgetter 来实现:

class A {
    private String x;

    public void setX(String value, Object obj){
        if(obj instanceof I2){
            this.x = value;
        }
    }

    public String getX(Object obj){
        if(obj instanceof I2){
            return this.x;
        }else{
            return null;
        }
    }
}

用法:

A a = new A();
a.setX("ABC",this);
a.getX(this);

对于仅独立接口的解决方案,只有:

class A {
    private String x;

    public void setX(AUser u, String x) {
        if (u != null) { this.x = x; }
    }
}

interface AUser {
}

我看到您必须执行多项检查。

  1. 当使用 getter 方法引用时,对象的状态应该是不可变的。例如如果您的 getter 方法返回对象或集合,则它不应该是可修改的。否则无论你在 setter 级别提供的任何保护都可以很容易地被击败。

  2. 尝试将授权约束与实际对象分离。可能使用 Proxy pattern.

  3. 使用 StackTraceElement 识别调用 class/method。可以使用 Thread.currentThread().getStackTrace() 导出。这也可以通过传递授权的 class.

  4. 实例来保护您的代码免受欺骗 setter 方法

总的来说,不管是设计上的缺陷还是必要性,如果你以后决定改正它,你就可以做到,而且不会留下任何痕迹。调用程序无需更改。