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的更多相关文章

  1. Java 的不可变类 (IMMUTABLE CLASS) 和 可变类 (MUTABLE CLASS)

    一.简单定义不可变对象(Immutable Objects)即对象一旦被创建,它的状态(对象的数据,也即对象属性值)就不能改变,反之即为可变对象(Mutable Objects).当满足以下条件时,对 ...

  2. ibatis.net调用oracle存储过返回游标SYS_REFCURSOR结果集

    最近在用ibatis.net框架和oracle 11g开发一套程序.其中有一个需求就是通过存储过程,查询指定条件的数据集. 但是在开发的过程中遇到了问题,问题如下: 1.如何通过ibatis.net执 ...

  3. Java 集合存储都返回什么?

    1.抛出一个类 package com.math.spring; import com.google.common.collect.Lists; import com.google.common.co ...

  4. iOS 关于objectForKey返回类型是不是mutable

    以前看NSUserDefault时,记住了那里的objectForKey返回的一定是immutable的对象.现在有点弄混了,其实,NSObject的objectForKey方法没有这个限制,是可以返 ...

  5. 【转】C++成员函数的存储方式

    [转] http://c.biancheng.net/cpp/biancheng/view/187.html 用类去定义对象时,系统会为每一个对象分配存储空间.如果一个类包括了数据和函数,要分别为数据 ...

  6. C++成员函数在内存中的存储方式

    用类去定义对象时,系统会为每一个对象分配存储空间.如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间.按理说,如果用同一个类定义了10个对象,那么就需要分别为10个对象的数据和函数代码分 ...

  7. const成员函数可以将非const指针作为返回值吗?

    先给出一段代码 class A { int *x; public: int *f() const { return x; } }; 成员函数f返回指向私有成员 x 的非常量指针,我认为这会修改成员x ...

  8. c++成员函数的存储方式---11

    原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 成员函数属于一个类的成员,出现再类体中.可以被指定为公有,私有或受保护的. 1.在类外面定义成员函数时, ...

  9. C++成员函数的存储方式

    用类去定义对象时,系统会为每一个对象分配存储空间.如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间. 按理说,如果用同一个类定义了10个对象,那么就需要分别为10个对象的数据和函数代码 ...

随机推荐

  1. 理解Android编译命令(转)

    一.引言 关于Android Build系统,这个话题很早就打算整理下,迟迟没有下笔,决定跟大家分享下.先看下面几条指令,相信编译过Android源码的人都再熟悉不过的. source setenv. ...

  2. excel文件批量重命名

    1.创建bat文件 2.在文件内输入以下格式的内容并保存,注意期间有空格 ren 1.txt 0011.txt     ren 2.txt 0021.txt     ren 3.txt 0031.tx ...

  3. java第八节 GUI/图形用户界面

    /* *第8讲 GUI/图形用户界面 * AWT的基础知识 * GUI全称是Graphical User Interface,即图形用户界面 * JDK中提供了AWT和Swing两个包,用于GUI程序 ...

  4. Ubuntu 13.04有线连接异常

    最近安装了Ubuntu 13.04 64位版,发现有线连接经常会掉线,通常在连接上一段时间(或长或短)就无法上网,ping不通,但是ifconfig显示一切正常,重启NetworkManager也不行 ...

  5. cnblogs修改网站图标icon

    以下修改网络地址即可 <script type="text/javascript" language="javascript"> //Setting ...

  6. @Transient注解的使用

    转自:https://blog.csdn.net/sinat_29581293/article/details/51810805 java 的transient关键字的作用是需要实现Serilizab ...

  7. Weex学习与实践

    Weex学习与实践(一):Weex,你需要知道的事 本文主要介绍包括Weex基本介绍.Weex源码结构.初始化工程.we代码结构.Weex的生命周期.Weex的工作原理.页面间通信.boxmodel ...

  8. golang下划线(underscore) 总结

    一.概述 "_" 可以简单理解为赋值但以后不再使用,在golang中使用的比较多,使用的场合也很多,稍作总结: 二.场景 1.import import _ "net/h ...

  9. Linux安装ElasticSearch-2.2.0-分词器插件(Mmseg)

    1.在gitpub上搜索elasticsearch-analysis,能够看到所有elasticsearch的分词器: 2.安装Mmseg分词器:https://github.com/medcl/el ...

  10. TCP详解 (1)

    网络层:  IP 被称为洲际协议,ICMP称为互联网控制报文协议 IGMP 为互联网组管理协议 传输层:  传输层的作用是把应用程序给他的任务划分为数据包,然后传递给下面的层: 应用层:  应用层的协 ...