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