我有这个 vector 类:
public class Vector {
public double x;
public double y;
public double getLength() {
return Math.sqrt(x*x+y*y);
}
}
大多数时候我只是想按原样使用它,但在某些情况下我想使用它的 volatile 版本,所以我尝试扩展它:
public class VectorVolatile extends Vector {
public volatile double x;
public volatile double y;
}
其背后的想法是将原始类中的所有函数也用于 volatile 类。但这行不通。变量 (x, y) 将无法正确替换。
我想使用 volatile,因为我有 2 个线程。一个线程读取并写入该对象,另一个线程仅读取。我想使用 volatile 而不是同步,因为我认为它更快,并且由于一个线程仅读取,因此将变量设置为 volatile 应该足够了。
有没有一种方法可以从原始类中获取所有函数,而无需复制和粘贴?我不应该使用 volatile 吗?
最佳答案
通过扩展,您没有更改 Vector
类成员的属性。
当您扩展类并以相同名称声明新成员时,它将隐藏旧成员。也就是说,在类 VectorVolatile
中,this.x
和 super.x
只是两个不同的成员。一个是不稳定的,另一个则不是。
https://dzone.com/articles/variable-shadowing-and-hiding-in-java
(恕我直言,通过扩展非线程安全类使其成为线程安全并不是一个好主意)。
更简洁的方法可能是为提供 x 和 y 的类定义一个接口(interface),让方法在该接口(interface)上进行操作,然后为提供 x 和 y 的类提供不同的实现。
关于java - 扩展类并使变量可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60588766/