不應直接存儲或返回可變成員 Mutable members should not be stored or returned directly
阿新 • • 發佈:2018-08-20
via 調用 ets check 解決 store 而是 更改 instance
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() { returnstrings; // 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"}; } }
不應直接存儲或返回可變成員 Mutable members should not be stored or returned directly