1

我可以自己写,但我猜这是非常标准的。是否有一个标准的java类可以做到这一点?我知道这必须是一个运行时功能,因为我的代码的各个部分可以在不知道彼此在做什么的情况下设置它 - 如果发生这种情况,我只是希望它大声失败。

public class MutableOnce<Type T> {
    private T _t;
    private boolean _isSet = false;
    public void set(T t) {
        if(_isSet) {
            //raise exception
        }
        _t = t;
    public T get() { return _t; }
}
4

2 回答 2

6

您不想简单地使对象不可变的任何原因?这将使该类更易于使用,尤其是在并发环境中(您示例中的类不是线程安全的)。

public class Immutable<T> {
    private final T _t;
    public void Immutable(T t) {
        _t = t;
    }
    public T get() { return _t; } //you may want to return a copy of _t if _t is mutable
}
于 2012-04-25T14:21:46.647 回答
1

快速搜索后:

  1. 所有字段必须是私有的,最好是最终的
  2. 确保类不能被覆盖 - 使类最终,或使用静态工厂并保持构造函数私有
  3. 必须从构造函数/工厂填充字段
  4. 不要为字段提供任何设置器
  5. 注意收藏。使用 Collections.unmodifiable*。此外,集合应该只包含不可变对象
  6. 所有 getter 必须提供不可变对象或使用防御性复制
  7. 不要提供任何改变对象内部状态的方法。

资料来源:使对象不可变的可能方法

于 2012-04-25T14:23:01.897 回答