zoukankan      html  css  js  c++  java
  • 《Effective Java》—— 创建与销毁对象

    本篇主要总结的是《Effecticve Java》中关于创建和销毁对象的内容。

    比如:

    • 何时以及如何创建对象
    • 何时以及如何避免创建对象
    • 如何确保及时销毁
    • 如何管理对象销毁前的清理动作

    考虑用静态工厂方法代替构造器

    使用静态工厂的优势:

    • 有名称
    • 不必每次调用的时候都创建一个新的对象
    • 返回原返回类型的任何子类型对象
    • 在创建参数化类型实例时,代码更加简洁。

    使用静态工厂的缺点:

    • 类如果不包含公有的或者受保护的构造器,就不能被子类化
    • 与其他的静态方法实际上没有任何区别

    举个例子:

    public class Apple{
        public Apple(String type){}
        
        public static Apple newInstance(){
            return new Apple("qing");
        }
    }
    
    //使用的时候直接newInstance就可以
    Apple.newInstance();
    

    常用的静态工厂名称:valueOf,of,getInstance,newInstance,getType,newType.

    遇到多个构造器参数时考虑使用构建器

    如果参数很多,在使用的时候也会很繁琐。比如

    new Person(name,age,address,tel,gender);
    

    当参数大于三个的时候,就可以考虑使用构建器了,特别实在参数可选的时候。

    public class Person{
        public Person name(String name){return this;}
        public Person age(String age){return this;}
        public Person gender(String gender){return this;}
        public Person tel(String tel){return this;}
    }
    //使用的时候可以这样用
    (new Person()).name("xingoo").age(30).gender("male").tel(13333333333);
    

    使用构建器的缺点就是代码会比较冗长。

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

    第一种方式,是饿汉模式:

    publci class Elvis{
        public static final Elvis INSTANCE = new Elvis();
        private Elvis(){}
        public void xxx(){}
    }
    

    另一种方式,属于懒汉模式:

    public class Elvis{
        private static Elvis INSTANCE;
        private Elvis(){}
        public static Elvis getInstance(){
            if(INSTANCE == null)
                INSTANCE = new Elvis();
            return INSTANCE;
        }
        xxx
    }
    

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

    有一些比如工具类,是不想被实例化的,可以使用私有的构造方法,来避免实例化:

    public class XXUtil{
        private XXUtil(){}
    }
    

    缺点是这样的类无法被子类化。

    避免创建不必要的对象

    尽量应该避免创建不必要的对象,比如:

    String s = new String("xxx");
    

    其实创建了两个字符串对象。

    尽量优先使用long这种基本类型。

    消除过期的对象引用

    常见的是在栈操作,出栈操作并不意味着释放对象。

    public Object pop(){
        if(size == 0)
            throw new EmptyStackException();
        Object result = elements[--size];
        elements[size] = null;
        return result;
    }
    

    避免使用终结方法

    finalizer方法是再垃圾回收的时候触发的,因此不能准确的知道终结方法调用的时间。因此最好是在try catch finally的时候释放对象。

    这种释放对象的时机,叫做显示终止方法。

  • 相关阅读:
    1070 结绳
    1069 微博转发抽奖
    1068 万绿丛中一点红
    1067 试密码
    1066 图像过滤
    1065 单身狗
    CSS--文本溢出与换行
    css--滤镜filter
    css--flex布局
    css--table布局
  • 原文地址:https://www.cnblogs.com/xing901022/p/5910340.html
Copyright © 2011-2022 走看看