Mutable objects are those whose state can be changed. For instance, an array is mutable, but a String is not. Mutable class members should never be returned to a caller or accepted and stored directly. Doing so leaves you vulnerable to unexpected changes in your class state.
Instead use an unmodifiable
Collection
(viaCollections.unmodifiableCollection
,Collections.unmodifiableList
, ...) or make a copy of the mutable object, and store or return copy instead.This rule checks that arrays, collections and Dates are not stored or returned directly.
可变对象是那些状态可以改变的对象。
例如,数组是可变的,但String不是。 永远不应将可变类成员返回给调用者或直接接受和存储。 这样做会使您容易受到类状态的意外更改的影响。
而是使用不可修改的Collection(通过Collections.unmodifiableCollection,Collections.unmodifiableList,...)或制作可变对象的副本,然后存储或返回副本。
此规则检查是否未直接存储或返回数组,集合和日期。
不合格的代码如下:
class A {
private String [] strings; public A () {
strings = new String[]{"first", "second"};
} public String [] getStrings() {
return strings; // Noncompliant
} public void setStrings(String [] strings) {
this.strings = strings; // Noncompliant
}
} public class B { private A a = new A(); // At this point a.strings = {"first", "second"}; public void wreakHavoc() {
a.getStrings()[0] = "yellow"; // a.strings = {"yellow", "second"};
}
}
合格代码解决方案
class A {
private String [] strings; public A () {
strings = new String[]{"first", "second"};
} public String [] getStrings() {
return strings.clone();
} public void setStrings(String [] strings) {
this.strings = strings.clone();
}
} public class B { private A a = new A(); // At this point a.strings = {"first", "second"}; public void wreakHavoc() {
a.getStrings()[0] = "yellow"; // a.strings = {"first", "second"};
}
}