良好的Java编码习惯(一)

博主双12入手了一本"Effective Java第二版",本系列文章将初步梳理书中内容,我也查了些资料,我会针对知识点做一点展开,方便以后复习回顾;

Item1.考虑用静态工厂代替构造器:

    静态工厂的优势:

更易于阅读(有名称)

可以做成单例(Singleton)的
可以实现多态(返回多个子类型的对象)
在创建参数化类型的实例时,他们使代码变得更加简洁

     静态工厂存在的不足:

      1.类如果不含共有的或者受保护的构造器,就不能被子类化;

       2.他们与其它的静态方法其实没区别,因此对于客户来说如何使用变成了难题.

 Item2:对于多个构造器参数时,利用构建器(Builder Mode):

  利用构造器重载确实可以解决少量构造器参数对象的初始化,但大量比如十几个甚至几十个的时候,客户端的代码很难编写,更别说阅读了,建议用建造者模式来解决;

  建造者模式的核心就是:将需要的域(包括必须的参数和不必须的参数)放在一个Builder类中,必须的参数放在Builder的构造器中初始化(只要用到Builder对象就会调用其构造器),可选参数利用对应的set方法供客户端调用实现初始化:

//Builder Parttern
public class User {
        private final String userName;
        private final String pwd;
        private final String mobile;
        private final String e_mail;

        public static class Builder {
                //Required parameters
                private final String userName;
                private final String pwd;
                
                //Optional parameters - initialized to default values
                private final String mobile = "13900000000";
                private final String e_mail = "[email protected]";
                
                public Builder(String userName, String pwd){
                        this.userName = userName;
                        this.pwd = pwd;
                }
                
                public Builder mobile(String mobile){
                        this.mobile = mobile;
                        return this;
                }

                public Builder e_mail(String e_mail){
                        this.e_mail = e_mail;
                        return this;
                 }

                 public User build(){
                         return new User(this);
                 }
        }
        
        private User(Builder builder){
                userName = builder.userName;
                pwd = builder.pwd;
                mobile = builder.mobile;
                e_mail = builder.e_mail;
        }
}


//Client Code
User user = new User.Builder("Joey","123").mobile("13512511111").
                        e_mail("[email protected]");

但建造者模式实现也不是完美的,为了创建对象,必须先创建其构建器,在十分注重性能的场景下,它有可能比重载构造器更加冗长,如果要用建造者模式,最好一开始就用.

猜你喜欢

转载自www.cnblogs.com/Joey44/p/10130826.html