首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使Java对象成为不可变的

使Java对象成为不可变的
EN

Stack Overflow用户
提问于 2013-08-13 02:33:09
回答 10查看 68.4K关注 0票数 67

我的目标是使Java对象不可变。我有一个Student类。我用以下方式对它进行了编码,以实现不变性:

代码语言:javascript
复制
public final class Student {

private String name;
private String age;

public Student(String name, String age) {
    this.name = name;
    this.age = age;
}

public String getName() {
    return name;
}

public String getAge() {
    return age;
}

}

我的问题是,实现Student类的不变性的最好方法是什么?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2013-08-13 02:35:21

严格地说,您的类并不是不可变的,它只是有效地不可变。要使其不可变,您需要使用final

代码语言:javascript
复制
private final String name;
private final String age;

尽管差别可能看起来很微妙,it can make a significant difference in a multi-threaded context。不可变的类本质上是线程安全的,有效不可变的类只有在安全发布的情况下才是线程安全的。

票数 69
EN

Stack Overflow用户

发布于 2013-08-13 02:34:45

使用final关键字:

代码语言:javascript
复制
private final String name;
private final String age;
票数 3
EN

Stack Overflow用户

发布于 2015-04-17 17:27:13

将变量设为私有且不使用setter方法将适用于原始数据类型。如果我的类有任何对象集合?

使任何具有集合对象的类不可变?

使用扩展集合类编写您自己的集合对象,并遵循私有变量,不使用setter方法。或者返回集合对象的克隆对象。

代码语言:javascript
复制
public final class Student {

private StudentList names;//Which is extended from arraylist

public Student() {
names = DAO.getNamesList()//Which will return All Student names from Database  its upto you how you want to implement.
}

public StudentList getStudentList(){
return names;//you need to implement your own methods in StudentList class to iterate your arraylist; or you can return Enumeration object.
}

public Enumeration getStudentNamesIterator(
Enumeration e = Collections.enumeration(names);
return e;
}

public class StudentList extends ArrayList {

}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18194139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档