如何销毁一个实例化对象_JAVA中如何创建和销毁对象
第1條 考慮用靜態方法代替構造器
類可以通過靜態工廠方法來提供它的客戶端,而不是通過構造器。提供靜態工廠方法而不是公有構造器,這樣做具有幾大優勢。
1.靜態工廠方法與構造器不同的第一大優勢在于,它們有名稱。
例如,構造器BigInteger(int,int,Random)返回的BigInteger可能為素數,如果名為BigInteger.probablePrime的靜態工廠方法來表示,顯然更為清晰
2.靜態工廠方法與構造器不同的第二大優勢在于,不用在每次調用它們的時候都創建一個新對象。
靜態工廠方法能夠為重復的調用返回相同對象,這樣有助于類總能控制在某個時刻哪些實例應該存在。這種類被稱作實例受控的類。實例受控使得類可以確保他是一個Singleton或者是不可實例化的。
3.靜態工廠方法與構造器不同的第三大優勢在于,它們可以返回原返回類型的任何子類型的對象。
這種靈活性的一種應用是,API可以返回對象,同時又不會使對象的類變成公有的。以這種方式隱藏實現類會使API變的非常簡潔。
4.靜態工廠方法的第四大優勢在于,在創建參數化類型實例的時候,它們使代碼變得更加簡潔
其實這一點java1.7就已經優化,調用參數化構造器時,它會自動進行類型檢查,不需要顯示申明
Map> map = new HashMap>();
//上下兩種方式都是可以的
Map> map = new HashMap<>();
靜態工廠方法的主要缺點在于,類如果不含公有的或者受保護的構造器,就不能被子類化。
靜態工廠方法的第二個缺點在于,它們與其他的靜態方法實際上沒有任何區別。
最后附上靜態工廠方法的一些慣用命名:
valueOf----不太嚴格講,該方法返回的實例與它的參數具有相同的值。這樣的靜態工廠方法實際上是類型轉換方法。
of----valueOf的一種更為簡潔的替代,在EnumSet中使用并流行起來。
getInstance----返回的實例是通過方法的參數來描述的。
newInstance----和getInstance一樣,但newInstance能夠確保返回的每個實例都與所有其他實例不同。
getType----和getInstance一樣,但是在工廠方法處于不同的類中的時候使用。Type表示工廠方法所返回的對象類型。
newType----和newInstance一樣,但是在工廠方法處于不同的類中的時候使用。Type表示工廠方法所返回的對象類型。
第2條 遇到多個構造器參數時要考慮用構建器
靜態工廠和構造器有個共同的局限性:它們都不能很好地擴展到大量的可選參數。
第三種替代方法,即能保證像重疊構造器模式那樣的安全性,也能保證像JavaBeans模式那么好的可讀性。這就是Builder模式的一種形式。不直接生成想要的對象,而是讓客戶端利用所有必要的參數調用構造器(或者靜態工廠),得到一個builder對象。讓后客戶端在builder對象上調用類似于setter的方法,來設置每個相關的可選參數。最后客戶端調用無參的builder方法來生成不可變的對象。
其實,像SpringBoot啟動類就是個典型的例子:
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) throws Exception {
//使用構建器創建SpringApplication對象
SpringApplication springApplication = new SpringApplicationBuilder()
.bannerMode(Banner.Mode.CONSOLE)
.initializers(ApplicationContextInitializerImpl.instance())
.sources(Application.class)
.build();
springApplication.run();
}
}
第3條 用私有構造器或者枚舉類型強化Singleton屬性
實現Singleton有兩種方法。這兩種方法都要把構造器保持為私有的,并導出公有的靜態成員,以便允許客戶端能夠訪問該類的唯一實例。
實現Singleton還有第三種方法。只編寫一個包含單個元素的枚舉類型:
private enum Elvis {
INSTANCE;
public void leaveTheBuilding(){...}
}
第4條 通過私有構造器強化不可實例化的能力
其實就像一些工具類,我們不想讓其他用戶創建該類對象,也不想被其他類繼承,我們只要把這個類的構造器私有化,他就不能被實例化了。
第5條 避免創建不必要的對象
一般來說,最好能重用對象而不是在每次需要的時候就創建一個相同功能的新對象。
對于同時提供了靜態工廠方法和構造器的不可變類,通常可以使用靜態工廠方法而不是構造器,以避免創建不必要的對象。因為構造器在每次被調用的時候都會創建一個新的對象,而靜態工廠方法只會創建一個。
要優先使用基本類型而不是裝箱基本類型,要當心無意識的自動裝箱。
當你應該重用現有對象的時候,請不要創建新的對象。
第6條 消除過期的對象引用
清空過期引用的另一個好處是,如果它們以后又被錯誤地解除引用,程序就會立即拋出空指針異常,而不是悄悄地錯誤運行下去。盡快地檢測出程序中的錯誤總是有益的。
一般而言,只要類是自己管理內存,程序員就應該警惕內存泄漏問題。一旦元素被釋放掉,則該元素中包含的任何對象引用都應該被清空。
內存泄漏的另一個常見來源是緩存。
內存泄漏的第三個常見來源是監聽器和其他回調。確保回調立即被當做垃圾回收的最佳方法是只保存它們的弱引用。
第7條 避免使用終結方法
終結方法通常是不可預測的,也是很危險的,一般情況下是不必要的。使用終結方法會導致行為不穩定,降低性能,以及可移植性問題。
顯示終止方法的典型例子是InputStream、OutputStream和java.sql.Connection上的close方法。顯示的終止方法通常與try-finally結構結合起來使用,以確保及時終止。在finally子句內部調用顯示的終止方法,可以保證即使在使用對象的時候有異常拋出,該終止方法也會執行。
你應該在一個try塊中終結子類,并在相應的finally塊中調用超類的終結方法。這樣做可以保證:即使子類的終結過程拋出遺產,超類的終結方法也會得到執行。
總結
以上是生活随笔為你收集整理的如何销毁一个实例化对象_JAVA中如何创建和销毁对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python升级到最新版本windows
- 下一篇: 服务器通电显示黄灯,服务器内存亮黄灯