Java运用心得(一)

来源:互联网 发布:苏州2.5产业园网络招聘 编辑:程序博客网 时间:2024/06/18 16:47

我们在项目开发中会用到非可变类,比如对于配置文件读取后生成的对象,比如一些常量生成的一个大对象,对于这类对象我们需要区别对待,把这类对象和一般类区分开来

实现非可变类需要遵循以下原则:

 *  1.不提供修改对象方法
 *  2.保证没有可被子类修改方法
 *  3.使所有域都是final的
 *  4.使所有域都是私有的
 *  5.保证对所有可变组件的互斥访问

 

由于项目代码贴出会造成难以理解,所以写个简单例子证明即可:

 

package org.finalclass;

public final class Test {
 private final float re;
 private final float im;
 
 public Test(float re,float im){
  this.re=re;
  this.im=re;
 }
 public float realPart(){
  return re;
 }
 public float imaginaryPart(){
  return im;
 }
 public Test add(Test c){
  return new Test(re+c.re,im+c.im);
 }
 
 
 public Test subtract(Test c){
  return new Test(re-c.re,im-c.im);
 }
 
 public Test multiply(Test c){
  return new Test(re*c.re,im*c.im);
 }
 
 public Test divide(Test c){
  return new Test(re/c.re,im/c.im);
 }
 
 
 
 @Override
 public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + Float.floatToIntBits(im);
  result = prime * result + Float.floatToIntBits(re);
  return result;
 }
 @Override
 public boolean equals(Object obj) {
  if (this == obj)
   return true;
  if (obj == null)
   return false;
  if (getClass() != obj.getClass())
   return false;
  Test other = (Test) obj;
  if (Float.floatToIntBits(im) != Float.floatToIntBits(other.im))
   return false;
  if (Float.floatToIntBits(re) != Float.floatToIntBits(other.re))
   return false;
  return true;
 }
 /**
  * main
  * @description:
  * @param args
  */

 public static void main(String[] args) {
  // TODO Auto-generated method stub

 }

}

 

这个类里的加减乘除都new一个新Test实例而不是修改当前实例,大多数非可变类都可以这么实现。非可变对象是线程安全的,不需要要求同步。而且它可被自由的共享。所以此类做法可以配合享元模式使用。

从这里也看出设计重要性,在设计中就把这些对象分离出来,在后续开发中就会变得简单和有效了很多!