1. 程式人生 > >不應直接存儲或返回可變成員 Mutable members should not be stored or returned directly

不應直接存儲或返回可變成員 Mutable members should not be stored or returned directly

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

(via Collections.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"};
  }
}

不應直接存儲或返回可變成員 Mutable members should not be stored or returned directly