Java'da Kullanımdan kaldırılmış yöntemler veya sınıflar kullanmak yanlış mı?


153

Tutulmayı bir web uygulaması geliştirmek için kullanıyorum. Bugün JAR dosyasını değiştirerek payanda versiyonumu güncelledim. Bazı yerlerde yöntemler kullanımdan kaldırıldı uyarıları alıyorum, ancak kod iyi çalışıyor.

Bazı şeyleri bilmek istiyorum

  1. Java'da Kullanımdan kaldırılmış yöntemler veya sınıflar kullanmak yanlış mı?

  2. Herhangi bir yöntemi değiştirmez ve uygulamamı sahip olduğum uyarılarla çalıştırırsam, herhangi bir performans sorunu oluşturur.


7
Ücretsiz 1955 Volkswagen Beetleolarak teklif edilseniz bile aracınızı sürmeye 'devam eder misiniz Corvette Stingray? (0:
KMån

75
@KMan bir Avrupa otomobilini bir Amerikan otomobili ile karşılaştırıyor musunuz ?;)
ponzao

2
@Ponzao ve 4diğerleri: Gotcha! (0;
KMån

2
Yanlış? Burada ölümcül mü yoksa sadece venial deprikasyondan mı bahsediyoruz?
FastAl

5
@Alexander yorumunuz için oy yok, bu yüzden +1 sizin için de;) her durumda, yeni kod eski koddan 1000 daha iyi. Karşılaştırma, ne zaman kırılacağını bilmediğiniz yeni lastikler arasında 1955 Volkswagen Beetleve arasında daha iyi olurdu 1956 Volkswagen Beetle!
Aleks

Yanıtlar:


265

1. Java'da Kullanımdan kaldırılmış yöntemler veya sınıflar kullanmak yanlış mı?

Kullanımdan kaldırıldı tanımından :

@Deprecated'e ek açıklama eklenmiş bir program öğesi, programcıların, genellikle tehlikeli olduğu veya daha iyi bir alternatif olduğu için kullanmaktan vazgeçtiği bir öğedir.

Yöntem, belirsiz bir süre boyunca geriye dönük uyumluluk için API'de tutulur ve gelecekteki sürümlerde kaldırılabilir. Yani, hayır, yanlış değil , ancak API değişikliklerine karşı daha sağlam olan daha iyi bir yol var.

2. Herhangi bir yöntemi değiştirmez ve uygulamamı sahip olduğum uyarılarla çalıştırırsam, herhangi bir performans sorunu yaratacaktır.

Büyük olasılıkla hayır. Kullanımdan kaldırılmadan önceki gibi çalışmaya devam edecektir. API yönteminin sözleşmesi değişmez. Bazı iç veri yapısı yeni, daha iyi bir yöntem lehine değişirse, performans etkisi olabilir, ancak bu pek olası değildir.


Komik kullanımdan kaldırılması Java API, imo olduğunu FontMetrics.getMaxDecent. Kullanımdan kaldırılma nedeni: Yazım hatası.

Kullanımdan kaldırıldı. JDK sürüm 1.1.1'den itibaren, yerini getMaxDescent () almıştır.


5
Java API'sinde bir sonraki en komik kullanımdan çıkarma, AbstractButton'da (Swing) setMultiClickThreshhold (int threshhold) ve getMultiClickTreshhold () olacaktır. Bu ikisine hazır olun! ;)
JavaTechnical

3
Bunu HTTP REFERER ile yapmamız gerekiyor.
Çıldırtıyor

1
@DaveMcClelland, 69: D'den 70 yaptı;)
VdeX

28

Kullanımdan kaldırılmış kodu, performans değiştirilmeden kullanmaya devam edebilirsiniz, ancak bir yöntemi / sınıfı kullanımdan kaldırmanın tüm amacı, kullanıcıların artık bunu kullanmanın daha iyi bir yolu olduğunu ve ileriki sürümlerde kullanımdan kaldırılmış kodun kaldırılacağını bilmelerini sağlamaktır.


1
Performansta değişiklik olmadığından nasıl emin olabilirsiniz? Amortismanlar olabilir örneğin nedeniyle bir dahili veri yapısının bir değişikliğe olmak, örneğin bir TreeSet bir HashSet, gelen söylüyorlar.
aioobe

@aioobe - Anladığım kadarıyla OP, kullanım dışı kod çağrılmasının herhangi bir performans sorunu olup olmadığını sordu, bunun üretilen bayt kodunu değiştirmediği (1.5'ten önce javadoc'daydı, şimdi ek açıklama kullanılıyor, ancak hala performansta değişiklik yok)
abyx

Bir kitaplığın bir sürümünden diğerine giderken, yeni sürümdeki bir yöntemin bayt kodunun, önceki sürümdeki aynı yöntemin bayt koduyla aynı olduğuna dair bir garanti yoktur.
aioobe

@aioobe - sadece kullanımdan kaldırılmasının bayt kodunu değiştirmeyeceğine dair bir garanti var, bu OP'nin ne anlama geldiğini düşünüyorum. Elbette kodun kendisi değişiyor, bu yüzden kodu kullanımdan kaldırıyoruz.
abyx

Önceki sürümle aynı sürümü kullanmaya devam ederseniz değişiklik olmaz. Ancak, kitaplığın daha yeni bir sürümünü kullanırsanız ve API'yı kullanımdan kaldırmamışlarsa, temeldeki uygulama büyük ölçüde değiştirilirse ve yeni API bundan yararlanırsa, eski API aşağıdaki gibi değilse, performansta bir değişiklik olabilir. eskiden olduğu gibi verimli, bu yeni yapıya karşı.
gregturn

21

terminoloji

Resmi Sun sözlüğünden:

kullanımdan kaldırma: Artık önerilmeyen ve gelecekteki bir sürümde var olabilen bir sınıfı, arabirimi, yapıcıyı, yöntemi veya alanı ifade eder.

Nasıl ve ne zaman kullanımdan kaldırılacağı kılavuzundan:

Konuşmacının önemini en aza indiren "kendini küçümseyen mizah" veya mizah terimini duymuş olabilirsiniz. Kullanımdan kaldırılmış bir sınıf veya yöntem böyledir. Artık önemli değil. Aslında o kadar önemsizdir ki artık kullanmamalısınız, çünkü yerini almıştır ve gelecekte var olmaktan vazgeçebilir.

@DeprecatedAçıklama bir adım daha gitti ve tehlike uyarmak:

Açıklamalı bir program öğesi @Deprecated, programcıların, genellikle tehlikeli olduğu veya daha iyi bir alternatif olduğu için kullanmaktan vazgeçtiği bir öğedir .

Referanslar


Doğru ya da yanlış?

Kullanımdan kaldırılmış yöntemleri kullanmanın doğru veya yanlış olup olmadığı sorusunun bireysel olarak incelenmesi gerekecektir. İşte TÜM kelime tırnak "kaldırılan" in görünür Etkili Java 2nd Edition :

Madde 7: Sonlandırıcılardan kaçının: Sonlandırmayı garanti ettiğini iddia eden tek yöntem System.runFinalizersOnExitve kötü ikiziRuntime.runFinalizersOnExit . Bu yöntemler ölümcül kusurludur ve kullanımdan kaldırılmıştır.

Öğe 66: Paylaşılan değişken verilere erişimi senkronize etme : Kütüphaneler Thread.stopyöntemi sağlar, ancak bu yöntem doğal olarak güvenli olmadığı için uzun zaman önce kaldırılmıştır - kullanımı veri bozulmasına neden olabilir.

Madde 70: Belge ipliği güvenliği :System.runFinalizersOnExit Yöntem, iş parçacığı açısından düşmanca ve kullanımdan kaldırıldı.

Madde 73: İplik gruplarından kaçının : Bir grup ipliğeThread bir kerede belirli ilkelleri uygulamanızı sağlar . Bu ilkellerin birçoğu kullanımdan kaldırılmıştır ve geri kalanı nadiren kullanılmaktadır. [...] iplik grupları kullanılmıyor.

En azından yukarıdaki yöntemlerin hepsinde, en azından Josh Bloch'a göre bunları kullanmak yanlış.

Diğer yöntemlerle, sorunları bireysel olarak düşünmeniz ve NEDEN kullanımdan kaldırıldıklarını anlamanız gerekir , ancak genel olarak konuşursak, kullanımdan kaldırma kararı haklı olduğunda, kullanmaya devam etme hakkından ziyade yanlış yönelme eğilimi gösterir.

İlgili sorular


3
"Kullanımdan kaldırıldı", "dua etmek" anlamına gelen Latince "de" + "önceden" anlamına gelmektedir. Bir şey onaylanmamış olarak tanımlandığında, bir Standart dua ediyor - yalvarıyor - onu kullanmamanız; bu Standardın gelecekteki bir sürümünde kaldırılabileceğine dair bir uyarıdır. Kullanımdan kaldırılmış bir özelliğin, söz konusu Standardın mevcut sürümünün herhangi bir uygulamasında tam olarak uygulanması gerektiğini unutmayın. Yine de, kendini küçümseyen mizahtan bahsettiğin şey biraz işaret dışı; bu anlamda "kendini küçümseme", farklı bir türetme ve anlama sahip olan "kendini küçültme" yolsuzluğudur.
dajames

17

Yukarıdaki tüm mükemmel yanıtların yanı sıra, kullanımdan kaldırılmış API çağrılarını kaldırmanın başka bir nedeni olduğunu gördüm.

Bir aramanın neden reddedildiğini araştırıyorum. Kendimi Java / API / Framework hakkında ilginç şeyler öğrenirken buluyorum. Genellikle bir yöntemin kullanımdan kaldırılmasının iyi bir nedeni vardır ve bu nedenlerin anlaşılması daha derin kavrayışlara yol açar.

Dolayısıyla, öğrenme / büyüyen bir bakış açısından, aynı zamanda değerli bir çaba


11

Kesinlikle bir performans sorunu oluşturmaz - kullanımdan kaldırılmış anlamına gelir, gelecekte işlev artık kitaplığın bir parçası olmayacaktır, bu nedenle yeni kodda kullanmaktan kaçınmalı ve kullanmayı bırakmak için eski kodunuzu değiştirmelisiniz. destekleri yükselttiğinizde ve bu işlevin artık mevcut olmadığını gördüğünüzde bir gün sorun yaşamazsınız


1
Deneyimden yola çıkarak, "kullanımdan kaldırılmış" gerçekten "artık bunu kullanmamanız gerektiği anlamına gelir, ancak her zaman ve her zaman kullanılabilir." En azından Java Standard API için, kullanımdan kaldırıldıktan sonra gerçekten kaldırılan herhangi bir yöntem veya sınıfın farkında değilim.
Michael Borgwardt

1
@Michael Eh, uygulamada API'lar nadiren kullanımdan kaldırılmış işlevleri kaldırırlar çünkü on yıl boyunca "UYARI: BU SİZİ KULLANMAYI DURDURUN" derleyicileriyle kullanımdan kaldırılabilirler ve insanlar yine de kaldırdıkları günü ters çevirirler. Sanırım kullanımdan kaldırılması "bir gün bunu çıkarmak istiyoruz, bu yüzden lütfen kullanmayı bırakın" anlamına geliyordu, pratikte nadiren olsa bile
Michael Mrozek

@Michael Mrozek: Açıklamaya katılmıyorum It certainly doesn't create a performance issue; bunu söylemek çok öznel.
KMån

1
@KMan Kullanımdan kaldırılmış olarak işaretlenen bir işlev, bir şekilde işaretlenmeden önce daha az verimli hale getirmez - eskisi gibi çalışır
Michael Mrozek

@Michael Borgwardt: Çoğu standart dilde bu şekilde çalışır. Ve elbette, kullanımdan kaldırılan bir şey standarttan çıkarılsaydı, popüler uygulamalar onu bir uzantı olarak tutacaktır.
David Thornley

8

Yanlış değil, sadece önerilmez. Bu, genellikle bu noktada bir şeyler yapmanın daha iyi bir yolu olduğu ve yeni geliştirilmiş yolu kullanırsanız iyi yapacağınız anlamına gelir. Kullanımdan kaldırılan bazı şeyler gerçekten tehlikelidir ve bundan tamamen kaçınılmalıdır. Yeni yol, kullanımdan kaldırılmış olandan daha iyi performans verebilir, ancak her zaman böyle değildir.


8

"Kendini küçümseyen mizah" terimini duymuş olabilirsiniz. Öneminizi en aza indiren mizah budur. Kullanımdan kaldırılmış bir sınıf veya yöntem böyledir. Artık önemli değil. Aslında o kadar önemsizdir ki, artık kullanılmayacaktır, çünkü gelecekte muhtemelen ortadan kalkacaktır.

Bundan kaçınmaya çalışın


4
  1. Genel olarak hayır, kullandığınız deprecatedkütüphaneden kaybolursa / kaybolduğunda herhangi bir problemden kaçınmak için iyi bir beklenmedik durum planınız olduğu sürece yöntemleri kullanmak kesinlikle yanlış değildir . Java API'nin kendisi ile bu asla olmaz, ancak hemen hemen her şeyle kaldırılacağı anlamına gelir. Yazılımınızın destekleyici kitaplıklarını özellikle yükseltmemeyi planlıyorsanız ( büyük olasılıkla uzun vadede yapmanız gerekir ), deprecatedyöntemlerin kullanılmasında sorun yoktur .
  2. Hayır.

3

Evet, yanlış.

Kullanımdan kaldırılan yöntemler veya sınıflar, Java'nın gelecekteki sürümlerinde kaldırılacak ve kullanılmamalıdır. Her durumda, mevcut bir alternatif olmalıdır. Bunu kullan.

Bir proje hedefine ulaşmak için kullanımdan kaldırılmış bir sınıf veya yöntem kullanmanız gereken birkaç durum vardır. Bu durumda, gerçekten kullanmaktan başka seçeneğiniz yok. Java'nın gelecekteki sürümleri bu kodu kırabilir, ancak bir gereksinim varsa bununla yaşamak zorundasınız. Muhtemelen bir proje gereksinimini karşılamak için ilk kez yanlış bir şey yapmak zorunda değilsiniz ve kesinlikle son olmayacak.

Java'nın veya başka bir kütüphanenin yeni bir sürümüne yükselttiğinizde, bazen kullandığınız bir yöntem veya sınıf kullanımdan kaldırılır. Kullanımdan kaldırılan yöntemler desteklenmez, ancak beklenmedik sonuçlar üretmemelidir. Bu, onların ASAP kodunu değiştirmeyecekleri anlamına gelmez.

Kullanımdan kaldırma süreci, yazarların kodlarını eski bir API'dan yeni bir API'ye değiştirmek için yeterli zamana sahip olduklarından emin olmak için var. Bu zamandan yararlanın. Kodunuzu en kısa sürede değiştirin.


2

Yanlış değil, ancak kullanımdan kaldırılan yöntemlerin bazıları yazılımın gelecekteki sürümlerinde kaldırılmıştır, bu nedenle muhtemelen çalışma koduyla karşılaşmayacaksınız.



1
@KMan - postaladığınız linkte şu yazılı olarak yazılır - "Yöntem, API'da belirli bir süre geriye dönük uyumluluk için tutulur ve gelecekteki sürümlerde KALDIRILABİLİR." Ben de aynı şeyi yazdım - kullanımdan kaldırılan yöntemlerden bazıları yakın veya uzak gelecekte kaldırılabilir.
Petar Minchev

2

Java'da Kullanımdan kaldırılmış yöntemler veya sınıflar kullanmak yanlış mı? "

Böyle yanlış değil ama size biraz sorun kurtarabilir. Kullanımdan kaldırılmış bir yöntem kullanmanın kesinlikle önerilmediği bir örnek:

http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

Thread.stop neden kullanımdan kaldırıldı?

Çünkü doğal olarak güvensizdir. Bir iş parçacığının durdurulması, iş parçacığının kilitlediği tüm monitörlerin kilidini açmasına neden olur. (ThreadDeath istisnası yığını yükseltirken monitörlerin kilidi açılır.) Bu monitörler tarafından önceden korunan nesnelerden herhangi biri tutarsız bir durumdaysa, diğer iş parçacıkları artık bu nesneleri tutarsız bir durumda görüntüleyebilir. Bu tür nesnelerin hasar gördüğü söylenir. İş parçacıkları hasarlı nesneler üzerinde çalıştığında, rasgele davranışlar ortaya çıkabilir. Bu davranış ince ve algılanması zor olabilir veya telaffuz edilebilir. Diğer denetlenmeyen istisnaların aksine, ThreadDeath dişleri sessizce öldürür; bu nedenle, kullanıcının programının bozuk olabileceği konusunda hiçbir uyarısı yoktur. Yolsuzluk, gerçek hasar meydana geldikten sonra, ileride saatler veya günler bile olsa, herhangi bir zamanda kendini gösterebilir.


Herhangi bir yöntemi değiştirmez ve uygulamamı sahip olduğum uyarılarla çalıştırırsa, herhangi bir performans sorunu yaratacaktır.

Performans açısından herhangi bir sorun olmamalıdır. Standart API, uygulamaların yavaş yavaş Java'nın yeni sürümlerine uyarlanabilmesi için bazı geriye dönük uyumluluk değerlerine uyacak şekilde tasarlanmıştır.


2

Java'da Kullanımdan kaldırılmış yöntemler veya sınıflar kullanmak yanlış mı? "Yanlış" değil, hala çalışıyor ama mümkün olduğunca kaçının.

Bir yöntemle ilişkili bir güvenlik açığı olduğunu ve geliştiricilerin bunun bir tasarım hatası olduğunu belirlediğini varsayalım. Bu nedenle, yöntemi kullanımdan kaldırmaya ve yeni yolu tanıtmaya karar verebilirler.

Yani hala eski yöntemi kullanıyorsanız, bir tehdidiniz var. Kullanımdan kaldırılma nedeninin farkında olun ve bunun sizi nasıl etkilediğini kontrol edin.

herhangi bir yöntemi değiştirmez ve uygulamamı sahip olduğum uyarılarla çalıştırırsa, herhangi bir performans sorunu yaratacaktır.

Kullanımdan kaldırma bir performans sorunundan kaynaklanıyorsa, bir performans sorunundan muzdarip olursunuz, aksi takdirde böyle bir sorunun olması için hiçbir neden yoktur. Yine belirtmek isterim ki, kullanımdan çıkarma nedeninin farkında olun.


2

Java'da @Deprecated, C # 'da [Eski].

Sanırım C # 'ın terminolojisini tercih ediyorum. Bu sadece eski olduğu anlamına gelir. İsterseniz yine de kullanabilirsiniz, ancak muhtemelen daha iyi bir yol var.

Windows 3.1'in eski olduğuna inanıyorsanız, Windows 7 yerine Windows 3.1 kullanmak gibidir. Yine de kullanabilirsiniz, ancak gelecekteki bir sürümde muhtemelen daha iyi özellikler vardır, ayrıca gelecekteki sürümler muhtemelen desteklenecektir - eski olan olmayacaktır.

Java'nın @Deprecated için de aynıdır - yine de yöntemi kullanabilirsiniz, ancak kendi sorumluluğunuzdadır - gelecekte daha iyi alternatifleri olabilir ve hatta desteklenmeyebilir.

Kullanımdan kaldırılmış bir kod kullanıyorsanız, genellikle daha yeni bir API'ya yükseltmeniz gerekmediği sürece sorun yoktur - kullanımdan kaldırılmış kod orada olmayabilir. Kullanımdan kaldırılmış kod kullanan bir şey görürseniz, daha yeni alternatifleri kullanmak üzere güncellemek için öneririm (bu genellikle ek açıklamada veya Javadoc kullanımdan kaldırılmış bir yorumda belirtilir).

Düzenleme: Ve Michael tarafından işaret edildiği gibi, itiraz nedeni işlevselliği (veya işlevsellik bile var olmamalıdır) bir kusur nedeniyle ise, o zaman açıkçası, bir itiraz kodu kullanmamalısınız.


1
"Kullanımdan kaldırılmış bir kod kullanıyorsanız, daha yeni bir API'ye yükseltmeniz gerekmediği sürece sorun değil" - tam olarak değil. Thread.stop () öğesinin neden kullanımdan kaldırıldığına bakın ve herhangi bir JRE sürümünde bunun iyi olmadığını göreceksiniz.
Michael

Tamam, ben genellikle "genellikle" iyi (bu bit güncelleyecek) demek gerekir :) Bu nedenle, kendi sorumluluğunuzdadır kullanın. Açıkçası, onu reddetmenin nedeni işlevselliğindeki bir kusuru durdurmaksa, onu kullanmamak mantıklıdır. Genel olarak, kullanımdan kaldırılmış bir yöntem kullanmak iyidir. Yani ja, hepsi itiraz nedenine bağlı. Doğru.
jamiebarrow

1

Tabii ki hayır - tüm Java @Deprecated :-) aldığından, Java sürdüğü sürece bunları kullanmaktan çekinmeyin. Gerçekten kırık bir şey olmadığı sürece, herhangi bir fark fark etmeyecek. Anlamı - bu konuda okumak ve sonra karar vermek zorunda.

Ancak .Net'te, bir şey [Eski] olarak bildirildiğinde, daha önce hiç kullanmasanız bile hemen gidin ve okuyun - değiştirme işleminden daha verimli ve / veya daha kolay kullanım şansınız :-))

Bu yüzden genel olarak, bu günlerde tekno-muhafazakar olmak oldukça yararlı olabilir, ancak önce okuma işinizi yapmanız gerekir.


1

Kullanımdan kaldırılan yöntemin anlamı olduğunu hissediyorum; her yönüyle mevcut yönteme göre daha iyi olan bir alternatif = ive yöntemi vardır. Mevcut eski yöntemden daha iyi yöntemi kullanmak daha iyidir. Geriye dönük uyumluluk için eski yöntemler kullanımdan kaldırılmıştır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.