zoukankan      html  css  js  c++  java
  • 【Effective Java】3、避免创建不必要的对象

    创建对象的时候,有些变量可以一直保持的时候,可以不必要每次实例化对象的时候都把这些变量初始化一遍,可以使用静态和静态块的方式把这些变量的数据固定下来

    package cn.xf.cp.ch02.item5;
    
    import java.util.Calendar;
    import java.util.Date;
    import java.util.TimeZone;
    
    /**
     * 
     *功能:一般情况下创建对象的写法
     *时间:下午9:27:25
     *文件:PersonSlow.java 
     *@author Administrator
     *
     */
    public class PersonSlow
    {
        private final Date birthDate;
        
        public PersonSlow(Date birthDate)
        {
            this.birthDate = new Date(birthDate.getTime());
        }
        
        /**
         * 在固定的时间区间内
         * @return
         */
        public boolean isBetweenTheDate()
        {
            //获取对应GMT时间标准下的这段代码程序开始运行的时间,TimeZone.getTimeZone("GMT")
            Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
            //吧时间设置到相应的位置
            gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
            Date timeStart = gmtCal.getTime();
            gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
            Date timeEnd = gmtCal.getTime();
            
            return birthDate.compareTo(timeStart) >= 0 && birthDate.compareTo(timeEnd) < 0;
        }
    }

    把上面的代码改进到使用静态代码块的模式

    package cn.xf.cp.ch02.item5;
    
    import java.util.Calendar;
    import java.util.Date;
    import java.util.TimeZone;
    
    public class PersonFast
    {
        private Date birthDate;
        
        //在类初始化的时候就把起始时间和结束时间确定好
        private static final Date BOOM_START;
        private static final Date BOOM_END;
        
        public PersonFast(Date birthDate)
        {
            this.birthDate = new Date(birthDate.getTime());
        }
        
        //通过静态代码块来实现和类一起初始化之后不在改变
        static
        {
            Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
            gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
            BOOM_START = gmtCal.getTime();
            gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
            BOOM_END = gmtCal.getTime();
        }
        
        //比较时间函数
        public boolean isBetweenDate()
        {
            return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
        }
    }

    这样的话每次创建对象的时候,调用方法使用的私有变量都是最开始初始化好了的,如果调用这个方法的用户特别多,上千万个的话,那么这个方式的优势就体现出来了

  • 相关阅读:
    Rails 4.0 移除了 XML 参数解析器。若要使用请加入 actionpack-xml_parser
    Rails 之微信开发 : OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
    Rails :布局和视图渲染
    Rails ---> routes.rb 详解
    Rails : 产品环境(生产环境)的部署
    rake :You have already activated rake 10.1.0
    ruby : nil?, empty? and blank?的选择
    【Oracle11g】15_事务
    【机器学习】线性回归
    【Datastage】Datastage 11.5版本中Table action下的一个坑
  • 原文地址:https://www.cnblogs.com/cutter-point/p/5843767.html
Copyright © 2011-2022 走看看