Java模板包装类,允许您修改对象一次

Java模板包装类,允许您修改对象一次,java,immutability,Java,Immutability,我可以自己写,但我猜这是非常标准的。是否有一个标准的java类可以做到这一点?我知道这必须是一个运行时特性,因为我的代码的各个部分可以在不知道彼此在做什么的情况下设置它-我只希望在这种情况发生时,它会大声失败 public class MutableOnce<Type T> { private T _t; private boolean _isSet = false; public void set(T t) { if(_isSet) {

我可以自己写,但我猜这是非常标准的。是否有一个标准的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; }
}
公共类MutableOnce{
私人电讯;;
私有布尔值_isSet=false;
公共无效集(T){
如果(_isSet){
//引发异常
}
_t=t;
public T get(){return\u T;}
}

为什么不简单地使对象不可变?这会使类更易于使用,特别是在并发环境中(示例中的类不是线程安全的)

公共类不可变{
私人决赛;
公共无效不可变(T){
_t=t;
}
public T get(){return\u T;}//如果_T是可变的,则可能需要返回_T的副本
}

为什么不简单地使对象不可变?这会使类更易于使用,特别是在并发环境中(示例中的类不是线程安全的)

公共类不可变{
私人决赛;
公共无效不可变(T){
_t=t;
}
public T get(){return\u T;}//如果_T是可变的,则可能需要返回_T的副本
}
快速搜索后:

  • 所有字段必须是私有字段,最好是最终字段
  • 确保类不能被重写-使类成为最终类,或者使用静态工厂并保持构造函数私有
  • 必须从构造函数/工厂填充字段
  • 不要为字段提供任何设置器
  • 注意集合。使用集合。不可修改*。此外,集合应仅包含不可变对象
  • 所有getter必须提供不可变对象或使用防御性复制
  • 不要提供任何更改对象内部状态的方法
  • 来源:

    快速搜索后:

  • 所有字段必须是私有字段,最好是最终字段
  • 确保类不能被重写-使类成为最终类,或者使用静态工厂并保持构造函数私有
  • 必须从构造函数/工厂填充字段
  • 不要为字段提供任何设置器
  • 注意集合。使用集合。不可修改*。此外,集合应仅包含不可变对象
  • 所有getter必须提供不可变对象或使用防御性复制
  • 不要提供任何更改对象内部状态的方法

  • 来源:

    另一个要求是,默认情况下,我将要包装的布尔值为false,这意味着它必须在设置之前存在-这就是为什么作为setter的不可变w/构造函数无法工作的原因。我可能会将其设为null,如果(isNull)将其视为false…寻找一个封装“设置”的简单设计此布尔值的。为什么不在需要时创建对象?在创建对象之前,它不存在…不确定您试图用此结构实现什么。如果您可以解释为什么需要该行为,这将是可为空的设计。而不是“have”一个我需要创建一个地方来存储它,并维护逻辑来检查我是否已经有了一个。如果默认值为false,我可以避免这种情况,并且从一开始就有一个只能重写一次的。听起来我只是需要下决心,复杂性在两种设计中都是保守的。我不确定我是否完全理解倒立,但使用不可变设计检查object==null似乎更容易设计和维护。如果有多个对象,您可以在创建它们时将它们存储在集合中,并检查集合是否为空。例如,另一个要求是,默认情况下,我将要包装的布尔值为false,这意味着它必须在ore它是set-这就是为什么作为setter的不可变w/构造函数不起作用的原因。我也许可以将其设置为null,如果(isNull)将其视为false…寻找一个封装“set”的简单设计此布尔值的。为什么不在需要时创建对象?在创建对象之前,它不存在…不确定您试图用此结构实现什么。如果您可以解释为什么需要该行为,这将是可为空的设计。而不是“have”一个我需要创建一个地方来存储它,并维护逻辑来检查我是否已经有了一个。如果默认值为false,我可以避免这种情况,并且从一开始就有一个只能重写一次的。听起来我只是需要下决心,复杂性在两种设计中都是保守的。我不确定我是否完全理解倒立,但使用不可变设计检查object==null似乎更容易设计和维护。如果有多个对象,您可以在创建它们时将它们存储在集合中,并检查集合是否为空,例如。。。
    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
    }