[toc]

Chapter 2

1. 静态方法替代构造器

  1. 静态方法的第一优势,有名称
  2. 静态方法的第二优势,不必在每次调用的时候都返回一个新的对象
  3. 可以返回原类型的子类

类型转换方法from()

聚合方法 of()

聚合方法 valueOf()的应用

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}

2. 构建器代替构造方法

  1. 构造器参数较多时,使用构建器代替构造器,构建器就是静态内部类

3. 私有构造器或者枚举类强化单例模式

饿汉式单例模式,final修饰的共有静态属性

//单例模式,饿汉式,
class Singleton{
    //属性私有
    private  static final Singleton INSTANCE=new Singleton() ;

    //构造器私有
    private Singleton(){}

    public static void main(String[] args) {
        Singleton instance = Singleton.INSTANCE;
        Singleton instance1 = Singleton.INSTANCE;
        System.out.println(instance==instance1);  //true
    }
}

饿汉式单例模式之一(可以使用)

  1. 优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同 步问题。
  2. 缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始 至终从未使用过这个实例,则会造成内存的浪费
  3. 这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载 时就实例化,在单例模式中大多数都是调用getInstance方法, 但是导致类装载 的原因有很多种,因此不能确定有其他的方式(或者其他的静态方法)导致类 装载,这时候初始化instance就没有达到lazy loading的效果
  4. 结论:这种单例模式可用,可能造成内存浪费
//饿汉式单例模式,静态常量
class Singleton{
    //属性私有
    private final static Singleton singleton =new Singleton();

    //构造器私有
    private Singleton(){}

    //对外提供获取实例的方法
    public static Singleton getInstance(){
        return singleton;
    }

    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();
        System.out.println(instance==instance1);  //true
    }
}

枚举类实现单例模式(推荐) 优缺点说明:

  1. 这借助JDK1.5中添加的枚举来实现单例模式。不仅能避免多线程同步问题,而 且还能防止反序列化重新创建新的对象。
  2. 这种方式是Effective Java作者Josh Bloch 提倡的方式
  3. 结论:推荐使用
enum Singleton8{
    INSTANCE;
    public void hello(){
        System.out.println("hello");
    }

    public static void main(String[] args) {
        Singleton8 instance = Singleton8.INSTANCE;
        Singleton8 instance2 = Singleton8.INSTANCE;
        instance.hello();
        System.out.println(instance==instance2);
    }
}

9. try-with-resource优先于try-finally

try-with-resource使代码更佳清晰,简洁,也更能抛出有价值的异常

try-finally示例

try {
    FileOutputStream fos = new FileOutputStream("test.txt");
    try {
        fos.write('a');
    } catch (IOException e) {
        e.printStackTrace();
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

try-with-resource示例

try(
        FileInputStream fis = new FileInputStream("text2.txt");
        
        ){
    byte[] data = new byte[1024];
    int len = fis.read(data);

} catch (IOException e) {
    e.printStackTrace();
}

Chapter 7

42.Lambda优先于匿名类

public static void main(String[] args) {
        List<String> words = new ArrayList<String>();
        words.add("hellofff");
        words.add("worldff");
        words.add("heihei");

        //匿名内部
        Collections.sort(words, new Comparator<String>() {
            public int compare(String o1, String o2) {
                return o1.length()-o2.length();
            }
        });

       //lambda
       Collections.sort(words,(s1,s2)-> (s1.length()-s2.length()));

        //方法引用
        Collections.sort(words,Comparator.comparingInt(String::length)); 
        words.sort(Comparator.comparingInt(String::length));
        System.out.println(words);

    }