由findbug引出的对于JAVA mutable的思考
2017-10-19 18:47
561 查看
在使用findbug检查代码时,发现了EI_EXPOSE_REP警告:
[EI] May expose internal representation by
returning reference to mutable object [EI_EXPOSE_REP]
原代码:
private String[] name;
public String[] getName() {
return name;
}
public void setName(String[] name) {
this.name = name;
}
大致意思说get方法返回可变对象的话会影响类的封装性,可以被外部修改。
由此引出了java中对可变对象、不可变对象的概念:
可变类和不可变类(Mutable and Immutable Objects)的初步定义:
可变类:当你获得这个类的一个实例引用时,你可以改变这个实例的内容。
不可变类:当你获得这个类的一个实例引用时,你不可以改变这个实例的内容。不可变类的实例一但创建,其内在成员变量的值就不能被修改。
如何创建一个自己的不可变类:
.所有成员都是private
.不提供对成员的改变方法,例如:setXXXX
.确保所有的方法不会被重载。手段有两种:使用final Class(强不可变类),或者将所有类方法加上final(弱不可变类)。
.如果某一个类成员不是原始变量(primitive)或者不可变类,必须通过在成员初始化(in)或者get方法(out)时通过深度clone方法,来确保类的不可变。
一个示例
import java.util.Date;
public final class BrokenPerson
{
private String firstName;
private String lastName;
private Date dob;
public BrokenPerson( String firstName, public BetterPerson( String firstName,
String lastName, Date dob) String lastName, Date dob)
{ {
this.firstName = firstName; this.firstName = firstName;
this.lastName = lastName; this.lastName = lastName;
this.dob = dob; //error this.dob = new Date( dob.getTime() ); //correct
} }
public String getFirstName()
{
return this.firstName;
}
public String getLastName()
{
return this.lastName;
}
public Date getDOB() public Date getDOB()
{ {
return this.dob; //error return new Date( this.dob.getTime() );//correct
} }
}
4. jdk的可变类和不可变类
primitive变量: boolean,byte, char, double ,float, integer, long, short
jdk的不可变类:jdk的java.lang包中 Boolean, Byte, Character, Double, Float, Integer, Long, Short, String.
StringBuffer 可变类
java.util.Date 可变类
[EI] May expose internal representation by
returning reference to mutable object [EI_EXPOSE_REP]
原代码:
private String[] name;
public String[] getName() {
return name;
}
public void setName(String[] name) {
this.name = name;
}
大致意思说get方法返回可变对象的话会影响类的封装性,可以被外部修改。
由此引出了java中对可变对象、不可变对象的概念:
可变类和不可变类(Mutable and Immutable Objects)的初步定义:
可变类:当你获得这个类的一个实例引用时,你可以改变这个实例的内容。
不可变类:当你获得这个类的一个实例引用时,你不可以改变这个实例的内容。不可变类的实例一但创建,其内在成员变量的值就不能被修改。
如何创建一个自己的不可变类:
.所有成员都是private
.不提供对成员的改变方法,例如:setXXXX
.确保所有的方法不会被重载。手段有两种:使用final Class(强不可变类),或者将所有类方法加上final(弱不可变类)。
.如果某一个类成员不是原始变量(primitive)或者不可变类,必须通过在成员初始化(in)或者get方法(out)时通过深度clone方法,来确保类的不可变。
一个示例
import java.util.Date;
public final class BrokenPerson
{
private String firstName;
private String lastName;
private Date dob;
public BrokenPerson( String firstName, public BetterPerson( String firstName,
String lastName, Date dob) String lastName, Date dob)
{ {
this.firstName = firstName; this.firstName = firstName;
this.lastName = lastName; this.lastName = lastName;
this.dob = dob; //error this.dob = new Date( dob.getTime() ); //correct
} }
public String getFirstName()
{
return this.firstName;
}
public String getLastName()
{
return this.lastName;
}
public Date getDOB() public Date getDOB()
{ {
return this.dob; //error return new Date( this.dob.getTime() );//correct
} }
}
4. jdk的可变类和不可变类
primitive变量: boolean,byte, char, double ,float, integer, long, short
jdk的不可变类:jdk的java.lang包中 Boolean, Byte, Character, Double, Float, Integer, Long, Short, String.
StringBuffer 可变类
java.util.Date 可变类
相关文章推荐
- 针对于java实验的思考(一)
- 关于Call to static DateFormat 的Findbug警告思考
- 移动APP测试过程中对于BUG漏测的思考
- 对于开发 0 bug 代码的思考——Design by Contract 契约设计
- 静态java代码检查工具-findbug使用简介
- java对于浮点运算的bug
- 对于BUG漏测的思考【转载】
- java的学习总结(1)有关数组引出的一些思考以及一些注意点
- 【程序思考】RIA 对于 java 在 web 开发领域是否是一个转机?
- 对于开发 0 bug 代码的思考——Design by Contract 契约设计
- 透过现象看本质,一个Java多线程问题引出的思考
- FindBug,Java代码的监督者
- FindBug,Java代码的监督者
- [JAVA] 一条新闻引出的思考,关于不用中间变量交换两个变量的值
- 对于Java中重载的思考
- Findbug插件静态java代码扫描工具使用
- java中对于Map引发的一个bug
- java 对于 ajax的思考
- android 升级ADT到22后,出现bug: Could not find class,或者Caused by: java.lang.ClassNotFoundException:异常
- 【程序思考】RIA 对于 java 在 web 开发领域是否是一个转机?