有没有办法让 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
中的 instanceof
和 x
的 getter
来实现:
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 {
}
我看到您必须执行多项检查。
当使用 getter 方法引用时,对象的状态应该是不可变的。例如如果您的 getter 方法返回对象或集合,则它不应该是可修改的。否则无论你在 setter 级别提供的任何保护都可以很容易地被击败。
尝试将授权约束与实际对象分离。可能使用 Proxy pattern
.
使用 StackTraceElement 识别调用 class/method。可以使用 Thread.currentThread().getStackTrace()
导出。这也可以通过传递授权的 class.
实例来保护您的代码免受欺骗 setter 方法
总的来说,不管是设计上的缺陷还是必要性,如果你以后决定改正它,你就可以做到,而且不会留下任何痕迹。调用程序无需更改。
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
中的 instanceof
和 x
的 getter
来实现:
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 {
}
我看到您必须执行多项检查。
当使用 getter 方法引用时,对象的状态应该是不可变的。例如如果您的 getter 方法返回对象或集合,则它不应该是可修改的。否则无论你在 setter 级别提供的任何保护都可以很容易地被击败。
尝试将授权约束与实际对象分离。可能使用
Proxy pattern
.使用 StackTraceElement 识别调用 class/method。可以使用
Thread.currentThread().getStackTrace()
导出。这也可以通过传递授权的 class. 实例来保护您的代码免受欺骗 setter 方法
总的来说,不管是设计上的缺陷还是必要性,如果你以后决定改正它,你就可以做到,而且不会留下任何痕迹。调用程序无需更改。