码迷,mamicode.com
首页 > 其他好文 > 详细

不应直接存储或返回可变成员 Mutable members should not be stored or returned directly

时间:2018-08-20 17:20:59      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:point   you   ...   cond   mutable   tab   copy   []   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.unmodifiableCollectionCollections.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

标签:point   you   ...   cond   mutable   tab   copy   []   instance   

原文地址:https://www.cnblogs.com/xingyunblog/p/9506534.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!