我能想到两种基本方法.
第一种是只返回不可变的值.然后呼叫者可以按照自己的意愿行事,而不会冒任何对象的完整性.在您的情况下,不可变类型将是String:
class Special {
private String s = "bob";
String getName() { return s; }
void printName() { System.out.println(s); }
}
public class TestSpecial {
public static void main (String[] args ) {
Special sp = new Special();
String s2 = sp.getName();
s2 += "fred";
// Alternatively: StringBuilder s2 = new StringBuilder(sp.getName()).append("fred");
sp.printName(); // prints "bob"
}
}
注意:如果s需要是StringBuilder,则可以返回s.toString().
另一种选择是返回一个可变值,但在getter中创建一个防御性副本.换句话说,返回带有重复数据的单独引用:
class Special {
private StringBuilder s = new StringBuilder("bob");
StringBuilder getName() { return new StringBuilder(s); } // return a copy of s
void printName() { System.out.println(s); }
}
public class TestSpecial {
public static void main (String[] args ) {
Special sp = new Special();
StringBuilder s2 = sp.getName();
s2.append("fred");
sp.printName(); // prints "bob"
}
}