She*_*har 4 java immutability effective-java
我正在尝试按照Effective Java Item 15(Minimize Mutability)中给出的建议将可变类转换为Immutable类.谁能告诉我我创建的类是否完全不可变?
可变类
public class Record {
public int sequenceNumber;
public String id;
public List<Field> fields;
/**
* Default Constructor
*/
public Record() {
super();
}
public Record addField(Field fieldToAdd) {
fields.add(fieldToAdd);
return this;
}
public Record removeField(Field fieldToRemove) {
fields.remove(fieldToRemove);
return this;
}
public int getSequenceNumber() {
return sequenceNumber;
}
public String getId() {
return id;
}
public List<Field> getFields() {
return fields;
}
public void setSequenceNumber(int sequenceNumber) {
this.sequenceNumber = sequenceNumber;
}
public void setFields(List<Field> fields) {
this.fields = fields;
}
public void setId(String id) {
this.id = id;
}
}
Run Code Online (Sandbox Code Playgroud)
实地班
public class Field {
private String name;
private String value;
public Field(String name,String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
不变的阶级
public class ImmutableRecord {
private final int sequenceNumber;
private final String id;
private final List<Field> fields;
private ImmutableRecord(int sequenceNumber, List<Field> fields) {
this.sequenceNumber = sequenceNumber;
this.fields = fields;
this.id = UUID.randomUUID().toString();
}
public static ImmutableRecord getInstance(int sequenceNumber, List<Field> fields) {
return new ImmutableRecord(sequenceNumber, fields);
}
/********************* Only Accessor No Mutator *********************/
public int getSequenceNumber() {
return sequenceNumber;
}
public String getId() {
return id;
}
public List<Field> getFields() {
return Collections.unmodifiableList(fields);
}
/********************* Instance Methods *********************/
public ImmutableRecord addField(Field fieldToAdd) {
Field field = new Field(fieldToAdd.getName(), fieldToAdd.getValue());
List<Field> newFields = new ArrayList<Field>(fields);
newFields.add(field);
Collections.unmodifiableList(newFields);
ImmutableRecord immutableRecord = new ImmutableRecord(sequenceNumber, newFields);
return immutableRecord;
}
public ImmutableRecord removeField(Field fieldToRemove) {
Field field = new Field(fieldToRemove.getName(), fieldToRemove.getValue());
List<Field> newFields = new ArrayList<Field>(fields);
newFields.remove(field);
Collections.unmodifiableList(newFields);
ImmutableRecord immutableRecord = new ImmutableRecord(sequenceNumber, newFields);
return immutableRecord;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢
谢卡尔
nai*_*kus 11
不可以,列表字段应该被复制而不是存储直接引用
private ImmutableRecord(int sequenceNumber, List<Field> fields) {
this.sequenceNumber = sequenceNumber;
this.fields = fields; // breaks immutability!!!
this.id = UUID.randomUUID().toString();
}
Run Code Online (Sandbox Code Playgroud)
如果某人修改了List字段引用,那么您的类也会反映它.在指定this.fields之前,最好将集合的内容复制到另一个集合中
此外,您的类似乎是可变的,因为它有添加和删除方法:)
| 归档时间: |
|
| 查看次数: |
452 次 |
| 最近记录: |