以下Worm
(Write-Once-Read-Many)类可以在这种情况下提供帮助。
我们可以创建一个嵌套Wrapper
类,它存储您需要的最终变量。要初始化此变量,您只需调用wrapper
对象的构造函数。当您调用该方法getData()
时,您将获得最终变量的引用,以防它被初始化,否则,您将获得null
.
方法getData()
和setData(T data)
必须是线程安全的。为了提供它,我们使用对象的volatile
修饰符wrapper
。读取 volatile 变量是同步的,写入 volatile 变量也是同步的。尽管为使这段代码线程安全做了一些努力,但我没有在这方面对其进行测试。根据线程安全级别,您可以考虑使 setter 和 getter 同步。
public class Worm<T> {
private volatile Wrapper<T> wrapper;
public Worm() {}
public Worm(T data) throws IllegalAccessError
{
setData(data);
}
public T getData()
{
if (wrapper == null)
return null;
return wrapper.data;
}
public void setData(T data) throws IllegalAccessError
{
if (wrapper != null)
throw new IllegalAccessError();
else
wrapper = this.new Wrapper<>(data);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Worm<T> other = (Worm<T>) obj;
return Objects.equals(this.getData(), other.getData());
}
@Override
public int hashCode() {
return Objects.hashCode(this.getData());
}
final private class Wrapper<T> {
final private T data;
Wrapper(T data) {
this.data = data;
}
}
}