我知道这是一个相当简单的话题,但我真的想要围绕它.
这就是我想要做的,但它不喜欢最终修饰符.还有另一种方法可以达到我想要的效果吗?这基本上是我想确保id在整个生命期间不能改变.
private final long mId;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mId = getIntent().getLongExtra(ID_KEY, -1);
}
Run Code Online (Sandbox Code Playgroud)
我应该指出这是Android代码.谢谢你的帮助.我并不担心搞瘾者或搞砸者或任何改变我代码的人.我问的原因是将来证明我的代码将由下一个开发人员接管.我发现这篇文章也有助于解释一些问题.Android - 活动构造函数vs onCreate
Boz*_*zho 22
你不能.但是如果它是私有的并且你没有设置它,你可以保证没有外部对象改变它.
或者,您可以将long值包装在另一个类中 - LazyImmutableLong.但这是一个更冗长的方法,你可能不需要它(注意:下面的类不是线程安全的)
class LazyImmutableLong {
private Long value;
public void setValue(long value) {
if (this.value != null) {
return; // the value has already been set
}
this.value = value;
}
public long getValue() {return value;}
}
Run Code Online (Sandbox Code Playgroud)
在你的活动中
private LazyImmutableLong id = new LazyImmutableLong();
public void onCreate(..) {
id.setValue(..);
}
Run Code Online (Sandbox Code Playgroud)
小智 5
下面的Worm(Write-Once-Read-Many)类可以在这种情况下提供帮助。
我们可以创建一个嵌套Wrapper类,该类存储所需的最终变量。要初始化此变量,只需要调用wrapper对象的构造函数即可。调用该方法时getData(),如果最终变量已初始化,您将获得最终变量的引用,否则将获得null。
方法getData()和setData(T data)必须是线程安全的。为了提供它,我们使用对象的volatile修饰符wrapper。读取易失性变量是同步的,写入易失性变量也是同步的。即使已做出一些努力使该代码成为线程安全的,但我并未在这方面进行测试。根据线程安全级别,您可以考虑使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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
41848 次 |
| 最近记录: |