zoukankan      html  css  js  c++  java
  • 不应直接存储或返回可变成员 Mutable members should not be stored or returned directly

    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"};
      }
    }
  • 相关阅读:
    iOS提交后申请加急审核
    EF5.0修改实体的时候,出现“对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性这个错误
    验证码生成-->漂亮啊
    用js将毫秒时间转成正常时间
    Ajax异步请求-简单模版
    unity3d自己写角色移动脚本
    unity3d实现序列帧动画
    unity3d切换场景时,背景音乐保持播放
    C#给文件重命名
    NGUI如何创建自己的精灵图集
  • 原文地址:https://www.cnblogs.com/xingyunblog/p/9506534.html
Copyright © 2011-2022 走看看