示例

不可变对象是状态无法更改的对象。不可变类是其实例根据设计和实现是不可变的类。作为不可变性示例最常见的Java类是java.lang.String。

以下是陈规定型的示例:

public final class Person {

private final String name;

private final String ssn;     // (SSN ==社会安全号码)

public Person(String name, String ssn) {

this.name= name;

this.ssn= ssn;

}

public String getName() {

return name;

}

public String getSSN() {

return ssn;

}

}

对此的一种变体是将构造函数声明为,private并提供一个public static工厂方法。

不变类的  标准配方如下:所有属性必须在constructor(s)或工厂中设置method(s)。

应该没有二传手。

如果出于接口兼容性的原因而必须包含setter,则它们应该什么都不做或抛出异常。

所有属性都应声明为private和final。

对于引用可变类型的所有属性:该属性应使用通过构造函数传递的值的深层副本进行初始化,并且

属性的getter应该返回属性值的深层副本。

应该声明该类,final以防止有人创建不可变类的可变子类。

还有两点需要注意:不变性不会阻止对象为空。例如null可以分配给String变量。

如果将不可变的类属性声明为final,则实例本质上是线程安全的。这使不可变类成为实现多线程应用程序的良好构建块。

java常见不可变类_Java语言不可变类的诀窍相关推荐

  1. java语言特点解释类_Java语言特点

    Java语言特点 引导语:Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言.那么你知道Java语言的特点吗,以下是百分网小编分享给大家的Java语言特点,欢迎阅读! Java语言的特点 1 ...

  2. Java语言中提供了三个日期类_Java语言学习(5)-Java中基础封装类(日期、时间类)...

    日期和时间封装类 1. Data类 Java日期和时间采用Data类.Data类在java.util包中. Data类构造函数: 1)       Data()   采用当前时间初始化对象: 2)   ...

  3. java程序 构建mycircle类_Java语言程序设计(十九)对象和类的应用实例

    1.我们定义一个Circle类并使用该类创建对象,我们创建三个圆对象,1.0,25和125,然后显示这三个圆的半径和面积,将第二个对象的半径改为100,然后显示它的新半径和面积.程序清单如下: pac ...

  4. java常见的报错_Java中常见的错误有哪些?

    原标题:Java中常见的错误有哪些? 1.java.lang.Error 错误.是所有错误的基类,用于标识严重的程序运行问题.这些问题通常描述一些不应被应用程序捕获的反常情况. 原因: 1.对系统所访 ...

  5. java 同时修改同一个数据_Java 语言中锁的设计与应用

    前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8).使用场景进行举例,为读者介绍主流锁的知识点,以及不同的 ...

  6. java引入string类_Java基础教程——String类

    String类 Java程序中的所有字符串字面值(如 "abc" )都是String的实例 字符串是常量(因为 String 对象是不可变的,所以可以共享) 字符串的本质是字符数组 ...

  7. java中椭圆类_Java中的Graphics2D类基本使用的教程

    Java中的Graphics2D类基本使用的教程 Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能 ...

  8. java源程序可以有几个主类_Java源程序是由类定义组成的,每个程序可以定义若干个类,但只有一个类是主类。_学小易找答案...

    [填空题]分析以下程序的执行结果 #include using namespace std; class Sample { int x; int y; public: Sample(int a,int ...

  9. java中的祖先类_Java程序公共祖先类-Object

    在Java中,所有的类都继承自Object类,它是所有的始祖,但是我们不需要显示的书写extends Object. equals方法 在JDK中,Object类的equals方法的实现如下: pub ...

最新文章

  1. linux运维防火墙考题,Linux运维工程师:30道面试题整理 | 张戈博客
  2. IOS开发之Cocoa编程—— NSUndoManager
  3. Java1.5增加了新特性:可变参数
  4. 程序员5年工作经验,因频繁跳槽被面试官压工资!
  5. 第十一节:动态绑定class和style
  6. SQLite | Join 语句
  7. Linux基础:linux网络接口
  8. hadoop 修复hdfs中文件块错误 和文件修复 Error: java.io.IOException: Cannot obtain block length for LocatedBlock
  9. shell按照时间排序_初识Shell(3)
  10. Java根类--Object类
  11. 使用 URLDecoder 和 URLEncoder 对中文字符进行编码和解码
  12. SQL Server 创建链接服务器
  13. cad卸载不干净_一款极其好用的卸载神器:Geek Uninstaller,再也不怕软件卸载不干净!...
  14. 学习 Delphi 必读的6本书【转译】
  15. [python] Python二维码生成器qrcode库入门
  16. 学术英语视听说2听力原文_大学学术英语视听说2-高迎慧
  17. 用python祝福父亲节_父亲节送给父亲的祝福语,挑一句话发朋友圈!
  18. css3探测光圈_纯CSS3实现的镜头光晕(光圈)
  19. 【攻击威胁】女巫攻击(sybil attack)
  20. 2022年武汉市经开区企业研发费用投入奖励补贴政策申报条件以及奖补标准!

热门文章

  1. ML之xgboost:利用xgboost算法(sklearn+3Split+调参曲线+EarlyStop)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)
  2. 成功解决np.array(zip(x1, x2)).reshape(len(x1), 2) ValueError: cannot reshape array of size 1 int
  3. 成功解决AttributeError: 'GradientBoostingRegressor' object has no attribute 'staged_decision_function'
  4. Dataset之LSUN:LSUN数据集的简介、安装、使用方法之详细攻略
  5. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Menu/Menu的Command)
  6. 风控业务中的信用与欺诈的定义区别
  7. 洛谷1279 字串距离
  8. HTML 显示和隐藏浏览器滚动条
  9. 2.13生成可控的随机数据集合 模拟色子
  10. 黑客道诠释完整版1-7