打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
《Effective Java》笔记

Java语言支持四种类型:接口、类、数组、基本类型

类的成员由它的域field、方法、成员类、成员接口组成。

方法的签名signature由它的名称和所有参数类型组成,签名不包括它的返回类型。

API元素:类、接口、构造器、成员、序列化形式。

第二章  创建和销毁对象  7条

第1条  用静态工厂方法替代构造器

1 public static Boolean valueOf(boolean b){2 3   return b?Boolean.TRUE : Boolean.False;4 5 }

这样的好处是

  1、调用的时候有方法名,可以提供更多的信息。

  比存在多个入参一样的构造函数的时,用入参顺序互相区分好的多。

1 BigInteger(intint Random);2 3 BigInteger.makePrime(int,int Random);//多方法,可以有更多说明

  2、不用再每次调用的时候都创建一个新对象。

  可以让不可变类使用预先构建好的实例,或者缓存实例重复利用。

  可以控制每个类都是Singleton或者不可实例化的。这样就可以用a==b代替a.equals(b)来提高性能。

  3.可以返回原返回类型的任何子类型的对象,在选择返回类时有了更大的灵活性。

  API可以返回对象,又不会让对象的类变成公有的。使得API变得简洁。私有的类不显示,使用public的接口调用  private static的实现。同时接口的实现还能不断的变化,对调用者透明。如:

 1     public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) { 2         if (c==null) 3             return binarySearch((List<? extends Comparable<? super T>>) list, key); 4  5         if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD) 6             return Collections.indexedBinarySearch(list, key, c); 7         else 8             return Collections.iteratorBinarySearch(list, key, c); 9     }10 11     private static <T> int indexedBinarySearch(List<? extends T> l, T key, Comparator<? super T> c) {

  4、创建参数化类型实例,是的代码更简洁 (现在关于泛型的已经改进)

1 Map<String,List<String>> m = new HashMap<String,List<String>>()2 3 //改进为4 5  public static<K,V> HashMap<K,V> newInstance(){6 7         return new HashMap<K,V>();8 9       }

第2条  遇到多个构造器参数时要用构建器

当一个类的构造方法中需要传入许多参数,且除去几个必须的,还有很多可选的参数,可以用构建器来构建对象。这个在Google的DataStore中也比较常见。

 1   //Builder Pattern 2   public class NutritionFacts{ 3     private final int servingSize; 4     private final int servings; 5     private final int fat; 6     private final int sodium; 7      8     public static class Builder{ 9       // Required param10       private final int servings;11       private final int servingSize;12       13       //Optional parameters - initialized to default values14       private int fat = 0;15       private int sodium = 0;16       17       public Builder(int servingSize, int servings){18         this.servingSize = servingSize;19         this.servings = servings;20       }21       public Builder fat(int val){22         fat = val;23         return this;24       }25       public Builder sodium(int val){26         sodium = val;27         return this;28       }29       public NutritionFacts build(){30         return new NutritionFacts(this);31       }32     }33     34     private NutritionFacts(Builder builder){35       servingSize = builder.servingSize;36       servings = builder.servings;37       fat = builder.fat;38       sodium = builder.sodium;39     }40   }

调用:

1 NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).build();

第3条  用私有构造器或者枚举类型强化Singleton属性

可以搜素创建singleton实例的7中方法。

transient-瞬态:被瞬态定义的变量不可序列化。变量只会存储在内存中,不会被序列化作为本地缓存或者网络传输。

1 enum EnumSingleton{2     INSTANCE;3     public void doSomeThing(){4     }5 }

这种方法无偿的提供了序列化机制,绝对防止了多次实例化,即使是面对复杂的序列化或者反射攻击的时候。

1 public enum FruitEnum {  2     APPLE, ORAGE  3 }  

Java在创建枚举时会创建一个继承自java.lang.Enum的类,创建两个FruitEnum对象,同时分别赋值给APPLE和ORANGE这两个属性,调用的构造函数是定义在 java.lang.Enum中的protected Enum(String name, int ordinal)方法。在创建完成两个FruitEnum对象并且分别赋值给APPLE和ORIGIN之后,还创建了一个名叫ENUM$VALUES的数组,然后把APPLE和ORIGIN按照定义的顺序放如这个数组中。

  除了这个静态初始化器之外,编译器还为我们生成了两个静态方法,values()和 valueOf(java.lang.String)方法。其中values()方法将ENUM$VALUES数组拷贝一份然后返回,而valueOf(java.lang.String)方法则会调用java.lang.Enum类中的valueOf方法,其作用是根据参数名找到对应的具体的枚举对象,如果找不到的话会抛出一个IllegalArgumentException异常。 
  从上面的叙述可以看到,我们定义的枚举类型,经过编译器的处理最终会编程一个对象的定义,其中的枚举变量其实就是类的静态变量,因此Java中的枚举类型其实是具有很多对象的特性的,只不过平时我们都不太用到,比如枚举可以实现接口(不能继承)、定义方法等等。为了保证枚举类型像Java规范中所说的那样,每一个枚举类型极其定义的枚举变量在JVM中都是唯一的,在枚举类型的序列化和反序列化上,Java做了特殊的规定。

  在序列化的时候Java仅仅是将枚举对象的name属性输出到结果中,反序列化的时候则是通过java.lang.Enum的valueOf方法来根据名字查找枚举对象。同时,编译器是不允许任何对这种序列化机制的定制的,因此禁用了writeObject、readObject、readObjectNoData、writeReplace和readResolve等方法。

http://mysun.iteye.com/blog/1581119

第4条  通过私有构造器强化不可实例化的能力

将构造函数私有化,这样没有默认构造函数,同时应为子类的构造器都必须显示或者隐式调用父类。所以这样的类不能实例化也不能被继承。

第5条  避免创建不必要的对象

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
设计模式系列 | 建造者模式
设计模式之创建模式
Java 语言中 Enum 类型的使用介绍
java 编程思想 笔记
创建型-单例模式(Singleton Pattern)
Java笔记(一)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服