当前位置:天才代写 > tutorial > JAVA 教程 > Effective Java (5) 制止建设不须要的工具

Effective Java (5) 制止建设不须要的工具

2017-11-02 08:00 星期四 所属: JAVA 教程 浏览:71

一、引子

一般来说,最好能重用工具而不是每次需要的时候就建设一个沟通成果的新工具,出格是当工具不行变时,它始终可以被重用的。重用工具对措施机能起到重要浸染。

二、重用不行变工具

对付同时提供了静态工场要领和结构器的不行变类,凡是可以利用静态工场要领而不是结构器,以制止建设不须要的工具。

Boolean b1 = Boolean.valueOf("test"); // 利用静态工场要领(good)  
Boolean b2 = new Boolean("test"); // 利用结构器(bad)

三、重用不会被修改的可变工具

下面的例子业务为:检讨某小我私家是否出生于1946年 ~ 1964年期间。

/* 
 * 改造前 
 */
public class Person {  
    private Date birthDate = new Date();  
      
    public boolean isBabyBoomer() {  
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));  
      
        calendar.set(1946, Calendar.JANUARY, 1, 0, 0, 0);  
        Date boomStart = calendar.getTime();  
      
        calendar.set(1965, Calendar.JANUARY, 1, 0, 0, 0);  
        Date boomEnd = calendar.getTime();  
      
        return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0;  
    }  
}
/* 
 * 改造后 
 */
public class Person2 {  
    private Date birthDate = new Date();  
    private static Date BOOM_START;  
    private static Date BOOM_END;  
          
    static {  
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));  
              
        calendar.set(1946, Calendar.JANUARY, 1, 0, 0, 0);  
        BOOM_START = calendar.getTime();  
      
        calendar.set(1965, Calendar.JANUARY, 1, 0, 0, 0);   
        BOOM_END = calendar.getTime();  
    }  
      
    public boolean isBabyBoomer() {  
        return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;  
    }  
}

查察本栏目

改造前每挪用一次isBabyBoomer城市建设一个Calendar,TimeZone,Date工具,改造后的措施只会在初始化的时候建设这些工具一次。假如isBabyBoomer要领被频繁的挪用,那么将会显著地提高机能。

四、自动装箱和拆箱

看一下下面这个小措施,不知道你能不能发明什么问题?

public class Client {  
    public static void main(String[] args) {  
        long start = System.currentTimeMillis();  
        Long sum = 0L;  
        for (long i = 0; i < Integer.MAX_VALUE; i++) {  
            sum += i;  
        }  
        long end = System.currentTimeMillis();  
        System.out.println(">>>>>>>>>>Total spent time: " + (end - start) / 1000 + "s");  
    }  
}

因为sum界说为Long范例,导致这个措施建设了许多不须要的工具,每次往Long sum中增加long i 时城市构建一个实例。

结论:要优先利用根基数据范例而不是装箱根基范例,要当心无意识的自动装箱。

作者:csdn博客 zdp072

 

    关键字:


天才代写-代写联系方式