[英]Mutable items in Immutable
当我们使用Immutable对象库创建不可变类时,我们如何处理可变成员(例如juDate )?
注意:这不是关于java Date类, 而是与Immutable Objects java库完全相关,它将生成一些代码!
例:
@Value.Immutable
public interface MyImmutableClass {
Date creationDateTime();
}
有没有办法覆盖getter,以便它返回一个副本?
public Date creationDateTime() {
return new Date(creationDateTime.getTime());
}
有没有办法覆盖getter,以便它返回一个副本?
就像你在那里写的一样:
public Date creationDateTime() {
return new Date(creationDateTime.getTime());
}
(就像凯尔伍德在上面的评论中指出的那样)。
但是,如果您想避免在类中意外突变creationDateTime
,请考虑将millis存储为final long
:
private final creationDateTimeMillis;
public Date creationDateTime() {
return new Date(creationDateTimeMillis);
}
即使Date
是final
,也可以调用Date.setTime()
,从而改变内部状态,您无法重新分配creationDateTimeMillis
。
您可以使生成的方法protected
并仅从克隆getter方法提供字段:
@Value.Immutable
public abstract class WrapMutable {
protected abstract Date timestamp();
public Date getTimestamp() {
return new Date(timestamp().getTime());
}
}
然后,该字段的所有用法都是通过其copy-getter,而timestamp()
方法仅用于在构建器中定义setter:
WrapMutable obj = ImmutableWrapMutable.builder().timestamp(new Date()).build();
System.out.println(obj.getTimestamp());
System.out.println(obj.timestamp()); // Error: timestamp() has protected access in WrapMutable
根据我在Immutables问题跟踪器中的问题,我了解到处理可变对象的最简洁方法是使用自定义编码注释 。
我已经创建了一个小的开源项目tmtron-immutables编码来为java.util.Date
类创建这样的注释。 对于想要创建自定义编码的任何人来说,这应该是一个很好的起点。
然后你可以直接使用你的可变类(例如java.util.Date
)作为属性,并且仍然获得与不可变属性(如String,long等)相同的不变性保证。
@Value.Immutable
@DateEncodingEnabled
public interface ValueObject {
Date creationDate();
}
@DateEncodingEnabled
注释将确保只有Date对象的不可变long值存储在ImmutableValueObject
类中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.