public class Message { private String name; private int ID; public Message(String name) { this.name = name; this.ID = name.hashCode(); } public String getName() { return name; } public int getID() { return ID; } }
分析一下这个类,我们发现除了在构造函数中队类的成员变量进行了一次初始化之后,成员对象就不会再被改变,因为通过observer返回的是immutable的变量,客户端无法直接对该内存的数值进行修改,我们的代码是安全的。
public class Person { private String firstname; private String lastname; private Date time; public Person(String firstname, String lastname, Date time) { this.firstname = firstname; this.lastname = lastname; this.time = time; } public String getFirstname() { return firstname; } public String getLastname() { return lastname; } public Date getTime() { return time; } }
这是一个很经典的例子,这里的成员变量有两个是immutable的还有一个Date类的对象是mutable的,这样我们的代码就是一个mutable的了,有了漏洞。当我们进行如下操作:
Instant now = Instant.now(); Person jim = new Person("Jim", "Smith", new Date(now.toEpochMilli())); System.out.println(jim.getTime()); Date danger = jim.getTime(); danger.setTime(now.toEpochMilli() + 3600000); System.out.println(jim.getTime());
final List<String> people = new ArrayList<>();
对于上述的这么一个声明,由于List是mutable的,我们可以对他进行add,remove, sort…等等的操作,但是加了final之后,他就与一处内存绑定上了,这个时候,如果有以下的操作:
people = new ArrayList<>();
那么直接就会被静态类型检查报出error.
原文:https://www.cnblogs.com/-shuichi/p/10656504.html