我正在尝试按照 Effective Java Item 15 (Minimize Mutability) 中给出的建议将可变类转换为不可变类。谁能告诉我我创建的类是否完全不可变?
可变类
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;
}
}
字段类
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;
}
}
不可变类
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;
}
}
谢谢
谢卡尔