良好的Java編碼習慣(一)
阿新 • • 發佈:2018-12-20
博主雙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]");
但建造者模式實現也不是完美的,為了建立物件,必須先建立其構建器,在十分注重效能的場景下,它有可能比過載構造器更加冗長,如果要用建造者模式,最好一開始就用.