阻止访问自己内部的特定属性 class
Block access to specifc attribute inside own class
我正在使用 public java API 构建我的多线程应用程序,但我不知道这个 API 的某些方法是否是线程-安全 [事实上我真的认为他们不是]。
我一直在寻找最干净直接的方法来在我的代码上实现这种安全性,并决定使用 lambda 表达式。
我打算使用这样的东西:
public class Myclass {
private NotThreadSafe obj;
public Myclass() {
this.obj = new NotThreadSafe();
}
private synchronized void useNonThreadSafeObject(FunctionalInterface r) {
r.exec(this.obj);
}
private void method1() {
this.useNonThreadSafeObject((NotThreadSafe p)->{/*do stuff*/};);
}
private void method2() {
this.obj.someMethod();
}
/* any other methods */
}
我想确保 Myclass 中没有方法会直接调用 'obj'
所以所有方法都必须像method1一样使用obj,避免直接调用method2
当然 java 没有修饰符可以做到这一点,但我想知道是否有注释或其他方式在编译时检查它...
----[一开始没说清楚,想多解释一下]----
您可以简单地将 class 一分为二:
class Guard {
private final NotThreadSafe obj;
public Guard() {
this.obj = new NotThreadSafe();
}
synchronized void useNonThreadSafeObject(FunctionalInterface r) {
r.exec(this.obj);
}
}
public class Myclass {
private Guard guard=new Guard();
private void method1() {
guard.useNonThreadSafeObject(p -> {/*do stuff with p*/});
}
private void method2() {
guard.useNonThreadSafeObject(p->{/*do other stuff with p*/});
}
/* any other methods */
}
这是您可以获得的最佳隔离,因为无法从 MyClass
直接访问 obj
。但是请注意,这不是防弹的,仍然可以创建 FunctionalInterface
的自定义实现,它将保留接收到的 NotThreadSafe
实例并将其存储在堆中的某个位置,以便稍后访问它而无需Guard
。然而,这是一个更大的努力,不太可能意外发生......
我正在使用 public java API 构建我的多线程应用程序,但我不知道这个 API 的某些方法是否是线程-安全 [事实上我真的认为他们不是]。
我一直在寻找最干净直接的方法来在我的代码上实现这种安全性,并决定使用 lambda 表达式。
我打算使用这样的东西:
public class Myclass {
private NotThreadSafe obj;
public Myclass() {
this.obj = new NotThreadSafe();
}
private synchronized void useNonThreadSafeObject(FunctionalInterface r) {
r.exec(this.obj);
}
private void method1() {
this.useNonThreadSafeObject((NotThreadSafe p)->{/*do stuff*/};);
}
private void method2() {
this.obj.someMethod();
}
/* any other methods */
}
我想确保 Myclass 中没有方法会直接调用 'obj'
所以所有方法都必须像method1一样使用obj,避免直接调用method2
当然 java 没有修饰符可以做到这一点,但我想知道是否有注释或其他方式在编译时检查它...
----[一开始没说清楚,想多解释一下]----
您可以简单地将 class 一分为二:
class Guard {
private final NotThreadSafe obj;
public Guard() {
this.obj = new NotThreadSafe();
}
synchronized void useNonThreadSafeObject(FunctionalInterface r) {
r.exec(this.obj);
}
}
public class Myclass {
private Guard guard=new Guard();
private void method1() {
guard.useNonThreadSafeObject(p -> {/*do stuff with p*/});
}
private void method2() {
guard.useNonThreadSafeObject(p->{/*do other stuff with p*/});
}
/* any other methods */
}
这是您可以获得的最佳隔离,因为无法从 MyClass
直接访问 obj
。但是请注意,这不是防弹的,仍然可以创建 FunctionalInterface
的自定义实现,它将保留接收到的 NotThreadSafe
实例并将其存储在堆中的某个位置,以便稍后访问它而无需Guard
。然而,这是一个更大的努力,不太可能意外发生......