| public final class ImmutablePerson { |
| private final String name; |
| private final int age; |
| private final List<String> hobbies; |
| |
| // 构造函数 |
| public ImmutablePerson(String name, int age, List<String> hobbies) { |
| this.name = name; |
| this.age = age; |
| // 对可变对象举行防御性复制 |
| this.hobbies = new ArrayList<>(hobbies); |
| } |
| |
| // Getter方法 |
| public String getName() { |
| return name; |
| } |
| |
| public int getAge() { |
| return age; |
| } |
| |
| public List<String> getHobbies() { |
| // 返回副本以避免外部修改 |
| return new ArrayList<>(hobbies); |
| } |
| |
| // 重写toString方法以便于打印输出 |
| @Override |
| public String toString() { |
| return "ImmutablePerson{" + |
| "name='" + name + '\'' + |
| ", age=" + age + |
| ", hobbies=" + hobbies + |
| '}'; |
| } |
| |
| // 主方法用于测试 |
| public static void main(String[] args) { |
| List<String> hobbies = new ArrayList<>(); |
| hobbies.add("Reading"); |
| hobbies.add("Swimming"); |
| |
| ImmutablePerson person = new ImmutablePerson("Alice", 30, hobbies); |
| |
| // 打印输出不可变对象 |
| System.out.println(person); |
| |
| // 尝试修改不可变对象(这将导致编译错误) |
| // person.setName("Bob"); // 编译错误:没有setName方法 |
| |
| // 尝试通过getter方法返回的副本修改原始对象(这不会影响原始对象) |
| List<String> personHobbies = person.getHobbies(); |
| personHobbies.add("Running"); |
| System.out.println(person); // 输出不会显示添加的"Running" |
| } |
| } |
在这个示例中,ImmutablePerson类是一个不可变对象。它的字段name、age和hobbies都被声明为private和final,并且没有提供修改这些字段的setter方法。对于可变对象hobbies,在构造函数中举行了防御性复制,并且在getHobbies方法中返回了副本以避免外部修改。这样,一旦创建了ImmutablePerson对象,其状态就保持不变。