Tecrübelerime göre, geçersiz kılmanın tek bir nedeni var Object.finalize()
, ama bu çok iyi bir sebep :
finalize()
Eğer çağırmayı unutursanız, sizi bilgilendiren hata günlüğü kodunu yerleştirmek için close()
.
Statik analiz sadece önemsiz kullanım senaryolarında ihmalleri yakalayabilir ve başka bir cevapta belirtilen derleyici uyarıları, önemsiz olmayan bir şeyi yapmak için gerçekten devre dışı bırakmanız gereken şeyler hakkında çok basit bir görüşe sahiptir. (Tanıdığım veya duyduğum diğer programlayıcılardan çok daha fazla uyarım var, ancak aptal uyarıları etkinleştirmedim.)
Sonlandırma, kaynakların keşfedilmediğinden emin olmak için iyi bir mekanizma gibi görünebilir, ancak çoğu insan bunu tamamen yanlış bir şekilde görür: alternatif bir geri dönüş mekanizması olarak düşünürler, bunu otomatik olarak kurtaracak bir "ikinci şans" güvencesidir. unuttukları kaynakları elden çıkararak günü. Bu ölü bir yanlış . Herhangi bir şeyi yapmanın tek bir yolu olmalı: ya her zaman her şeyi kapatırsın ya da sonlandırma her zaman her şeyi kapatır. Ancak sonlandırma güvenilir olmadığından, sonlandırma olamaz.
Bu yüzden, Zorunlu İmha dediğim bu program var ve programcının her zaman açıkçaCloseable
veya uygulayan her şeyi açıkça kapatmaktan sorumlu olduğunu belirtiyor AutoCloseable
. (Kaynaklarla deneyin ifadesi hala kesin bir kapanış olarak sayılır.) Elbette, programcı unutabilir, bu yüzden sonuçlandırma devreye giriyor, ancak sonunda sihirli bir şey yapabilecek sihirli bir peri değil o close()
çağrılan değildi, öyle değilonu çağırmaya teşebbüs etmek, kesin olarak (matematiksel kesinlikle), çok tembel veya yapamayacakları çok fazla işi bilerek yapmak için ona güvenecek n00b programcılarının orduları olacak. Bu nedenle, zorunlu elden çıkarma ile, sonlandırma close()
çağrılmadığını keşfettiğinde, parlak kırmızı bir hata mesajı kaydeder ve programcıya, büyük harflerini büyük harflerle yazmasını söyler.
Ek bir fayda olarak, söylentiye göre “JVM önemsiz bir finalize () yöntemini görmezden gelecektir (örneğin, Nesne sınıfında tanımlandığı gibi herhangi bir şey yapmadan dönen sadece bir tane)”, böylece zorunlu elden çıkarma ile tüm sonlandırmalardan kaçınabilirsiniz. Sisteminizin genelindeki ek yük ( bu ek yükün ne kadar korkunç olduğu konusunda bilgi için alip'in cevabına bakınız ) finalize()
yönteminizi şöyle kodlayın:
@Override
protected void finalize() throws Throwable
{
if( Global.DEBUG && !closed )
{
Log.Error( "FORGOT TO CLOSE THIS!" );
}
//super.finalize(); see alip's comment on why this should not be invoked.
}
Bunun arkasındaki fikir , derleme zamanında değeri bilinen Global.DEBUG
bir static final
değişkendir, öyleyse false
derleyici tüm if
deyim için hiçbir kod çıkarmaz , bu da önemsiz (boş) bir sonlandırıcı olur. Sınıfınızın sonlandırıcı yokmuş gibi muamele göreceği anlamına gelir. (C # 'da bu güzel bir #if DEBUG
blokla yapılır , fakat ne yapabiliriz, bu javadır, kodda bariz bir şekilde ek yükü olan beyinde ek basitlik ödüyoruz.)
Zorunlu Elden Çıkarma hakkında daha fazla bilgi, noktaların Net olarak atılmasıyla ilgili ek tartışmalarla birlikte, burada: michael.gr: Zorunlu elden çıkarma, "Bertaraftan çıkarma" ile ilgili suistimal
finalize()
biraz dağılmış durumda. Bunu uygularsanız, aynı nesnede diğer tüm yöntemlere göre iş parçacığının güvenli olduğundan emin olun.