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