非可变类就是类的实例不能被修改的类。如String。

非可变类有很多好的存在理由非可变类更容易设计、实现和使用

不易犯错误

更安全

为了使类成为非可变的,要遵循下面5条原则不要提供任何修改对象的方法。

保证没有可以被重载的方法。这防止了粗心的或恶意的子类危害对象的不可变行为。防止方法被重载的一般方式是是类成为final的。

使所有的域成为final。

使所有的域都是私有的。

保证对任何可变组件互斥访问。

下面是一个稍微复杂的例子:

public final class Complex {

private final float re;

private final float im;

public Complex(float re, float im) {

this.re = re;

this.im = im;

}

public float realPart()        { return re; }

public float imaginaryPart()        { return im; }

public Complex add(Complex c) {

return new Complex(re+c.re,im+c.im);

}

...

public boolean equals(Object o) {

if(o==this)

return true;

if(!(o instanceOf Complex))

return false;

Complex c = (Complex) 0;

return(Float.floatToIntBits(re) == Float.floatToIntBits(c.re) ) &&

(Float.floatToIntBits(im) == Float.floatToIntBits(c.im));

}

public int hashCode() {

int result = 17 + Float.floatToIntBits(re);

result = 37*result + Float.floatToIntBits(im);

return result;

}

public String toString() {

return "("+re+" + "+im+"i)";

}

}

这个类表示复数,注意到算术操作创建和返回一个新的复数实例,而不是修改了这个实例。

非可变对象本质上是线程安全的,不需要同步机制。这是获得线程安全最简单的途径。线程不会看到其他线程对非可变对象施加的影响,因而,非可变对象可以被自由地共享。

非可变对象可以提供一个静态工厂,将经常被请求的实例缓存起来,避免在被请求的实例存在时,重复地创建新的实例。BigInteger和Boolean类都具有这种静态工厂方法。

不仅可以共享非可变对象,还可以共享它们的内部信息。

非可变对象为其他对象——无论是可变还是非可变的,创建了大量的构造块。

非可变对象的真正也是唯一的缺点是对每个不同的值要求一个单独的对象。

java高效编程_Java高效编程相关推荐

  1. java并发排它锁_Java并发编程进阶——锁(解析)

    一.锁是什么 java开发中进行并发编程时针对操作同一块区域时,如果不加锁会出现并发问题,数据不是自己预计得到的值.我觉得有点像mysql事务中脏读.不可重复读.幻读的问题.加锁的目的是为了保证同一时 ...

  2. java 函数式编程_Java函数式编程:Javaslang入门

    java 函数式编程 Java是一门古老的语言,并且该领域中有很多新手在他们自己的领域(JVM)上挑战Java. 但是Java 8到来并带来了一些有趣的功能. 这些有趣的功能使编写新的惊人框架(例如S ...

  3. java socket数据传输_Java Socket编程(一) Socket传输模式

    Java Socket编程(一) Socket传输模式 文章来源:ASPCN 作者:孙雯 Socket传输模式 Sockets有两种主要的操作方式:面向连接的和无连接的.面向连接的sockets操作就 ...

  4. java并发常量_Java并发编程-常量对象(七)

    在创建后状态不再发生改变的对象称作常量对象(Immutable Objects).常量对象其可靠性使其广泛地用作开发简单可靠代码的策略.常量对象在开发并发程序中非常有用.由于创建后不能被改变状态,它们 ...

  5. java 银行并发_java并发编程——通过ReentrantLock,Condition实现银行存取款

    Java 并发编程系列文章 java.util.concurrent.locks包为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器.该框架允许更灵活地使用锁和条件,但以更难用的语法为代价 ...

  6. java 并发统计_java并发编程|CountDownLatch计数器

    0x01,CountDownLatch介绍 CountDownLatch是一个计数器,作为java并发编程中三个组件之一,这个组件的使用频率还是很多的.这里分享下自己画的java并发编程组件的图,后面 ...

  7. java 并发队列_JAVA并发编程:阻塞队列BlockingQueue之SynchronousQueue

    前面在讲解Executors工厂创建可缓存线程的线程池(newCachedThreadPool)的时候有提到过SynchronousQueue队列,该线程池使用 SynchronousQueue 作为 ...

  8. java投票锁_Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...

  9. Java 高并发_JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过!...

    JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过! 1.JPG (37.82 KB, 下载次数: 0) 2018-12-3 09:40 上传 2.JPG (28 ...

最新文章

  1. 物理攻击规避(Physical Attack Mitigation)
  2. android如何设置多条广播,Android使用MulticastSocket实现多点广播图片
  3. [bzoj1059]矩阵游戏
  4. Java动态加载类(对反射的基本理解)
  5. ctk介绍、安装、使用详细说明pdf文档(中文).rar_Minio 安装和使用详解,还有对.net api进行了二次封装...
  6. MyStringTokenize
  7. 软件测试入门随笔——软件测试基础知识(一)
  8. 【小聪明】图片消失在另一张图片里
  9. html5图标用什么格式转换,ico转png 怎么把ico格式转换成png格式
  10. Java 无限级递归生成树级菜单
  11. JavaScript调用C#办法-转帖
  12. java 实现正弦曲线(模仿、练习Java swing)
  13. ble协议栈从零开始七(linklayer 之 privacy)
  14. 任务调度框架Quartz用法指南
  15. Did you mean feature with Apache Lucene Spell-Checker
  16. Angular+arcgisjs之平面地图测距、测面积、搜索
  17. Java开发的电子政务管理系统软件
  18. 【重磅推荐】【monero-node-rpcWallet】完美解决节点和RPCWallet同步,并且100%可以正常打开Wallet的方案【附加常见错误汇总】
  19. 德国的吃--一篇很有意思的文章
  20. 深入理解搜索引擎——开篇

热门文章

  1. 设置普通用户加入域配额
  2. HBase文件索引分析
  3. opencart导入导出export/import功能插件
  4. 如何避免jquery库和其它库的冲突
  5. 杨海坡:比特币分叉往事
  6. 不契合市场,Bitcoin SV愿景未必是给矿工的一个好选择
  7. 逢低买入?比特币、莱特币和比特币现金反弹行情一触即发?
  8. 基于maven使用IDEA创建多模块项目
  9. 通知中心NSNotificationCenter的使用
  10. 跨平台打造移动原生应用的10大武器