Soru Kullanımdan kaldırılmış ve eski bir API arasındaki fark nedir?


Java’daki eski API’ları inceliyordum. Collection Framework ve o gibi sınıfları öğrendim Vector ve HashTable tarafından reddedildi ArrayList ve HashMap.

Bununla birlikte, kullanımdan kaldırılmış ve esas olarak, geçersiz kılınan ve kaçınılması gereken yazılım özelliklerine uygun olmayan kullanım olarak kabul edilmeyen DEĞİLDİR ve bu nedenle, bir API'nin ne zaman eski olduğunu ve kullanımdan kaldırıldığını düşündüğünden emin değilim.


32
2018-05-20 11:36


Menşei


Geçerli soru. - CPerkins
Gerçekten iyi bir soru! Aynı şüphe vardı. - Java Developers Guide


Cevaplar:


Resmi Sun sözlüğünden:

karşı koyma: Artık tavsiye edilmeyen bir sınıf, arabirim, kurucu, yöntem veya alan anlamına gelir ve gelecekteki bir sürümde varolmayı bırakabilir.

Nasıl ve ne zamandan vazgeçme rehberine:

Konuşmacının önemini en aza indiren "kendini beğenmiş mizah" veya mizah kelimesini duymuş olabilirsiniz. Kullanımdan kaldırılmış bir sınıf veya yöntem böyle. Artık önemli değil. Aslında o kadar önemsizdir ki, artık kullanılmamalı, çünkü bunun yerini almamış ve gelecekte varlığını sürdürebilir.

@Deprecated ek açıklama bir adım daha ileri gitti ve tehlike uyarısı:

Bir program öğesi açıklamalı @Deprecated programcıların kullanmaktan vazgeçtikleri bir şeydir. tehlikeliya da daha iyi bir alternatif olduğu için.

Referanslar


Resmi sözlüğün "miras" ın ne anlama geldiğini tanımlamadığını unutmayın. Herhalde, Josh Bloch'un kesin bir tanım olmadan kullandığı bir terim olabilir. Bununla birlikte, ima, her zaman eski bir sınıfın asla yeni kodda kullanılmaması ve daha iyi ikame mevcut olmasıdır.

Eski ancak eski haline getirilmemiş bir sınıfı kullanan eski bir kod, herhangi bir işlem yapılmasını gerektirmez, çünkü en azından şimdilik, gelecekteki sürümde var olmaktan vazgeçme tehlikesi yoktur.

Bunun aksine, kullanımdan kaldırılma, varlığını sona erdirebileceklerini açıkça uyarmaktadır. Bu nedenle, değiştirmeye geçmek için harekete geçilmelidir.


Etkili Java 2. Sürüm'den alıntılar

Bu terimlerin bağlamda nasıl kullanıldığıyla karşılaştırmak için, bunlar kelimenin kitabın tırnaklarından alınmıştır. "Kullanımdan kaldırıldı" görüntülenir:

Madde 7: Sonlandırıcılardan kaçının: Kesinleşmeyi garanti eden tek yöntem şunlardır: System.runFinalizersOnExit ve onun kötü ikiz Runtime.runFinalizersOnExit. Bu yöntemler ölümcül kusurlu ve kullanımdan kaldırılmıştır.

Madde 66: Paylaşılan değişebilir verilere erişimi senkronize edin: Kütüphaneler Thread.stop yöntem, ancak bu yöntem doğal olarak çok eskiden beri kullanımdan kaldırıldı emniyetsiz - kullanımı veri bozulmasına neden olabilir.

Ürün 70: Doküman ipliği güvenliği: The System.runFinalizersOnExit yöntem iş parçacığıdır ve kullanımdan kaldırılmıştır.

Madde 73: İplik gruplarından kaçının: Belli bir şekilde uygulamanıza izin veriyorlar Thread Bir kerede çok sayıda iş parçacığına ilkel. Bu ilkellerin bir kısmı kullanımdan kaldırıldı ve geri kalanı seyrek olarak kullanıldı. [...] iş parçacığı eskidir.

Aksine, bunlar kelimenin nerede olduğu "Eski" görüntülenir:

Madde 23: Ham kodları yeni kodda kullanmayın: Jeneriklerin girilmesinden önce gelen eski kod ile uyumluluk ve birlikte işlerlik için sağlanmıştır.

Madde 25: Listeleri dizilere tercih et: Silme, jenerik türlerin generikleri kullanmayan eski kodlarla serbestçe çalışmasına izin veren şeydir.

Madde 29: Tipafe heterojen kapları düşünün: Bu sarmalayıcılar, genel ve eski kodları karıştıran bir uygulamada bir koleksiyona yanlış yazılan bir öğeyi kimlerin eklediğini izlemek için kullanışlıdır.

Madde 54: Yerel yöntemleri makul bir şekilde kullanınBunlar, eski verilere erişim sağlayabilen eski kod kütüphanelerine erişim sağlar. [...] Eski kodlara erişmek için yerel yöntemleri kullanmak da meşrudur. [...] Düşük düzey kaynaklara veya eski kitaplıklara erişmek için yerel yöntemler kullanmanız gerekiyorsa, olabildiğince az yerel kod kullanın ve iyice test edin.

Madde 69: Beklemek ve bildirmek için eşzamanlılık yardımcı programlarını tercih edin: Her zaman tutarlılık yardımcı programlarını tercih ettiğinizde kullanmalısınız. wait ve notifykullandığınız eski kodu korumanız gerekebilir. wait ve notify.

Bu alıntılar dikkatlice seçilmedi: kelimenin tam anlamıyla TÜM örnekleri "Kullanımdan kaldırıldı" ve "Eski" kitapta görünür. Bloch'un mesajı burada açık:

  • Kullanımdan kaldırılmış yöntemler, ör. Thread.stop, tehlikeli ve yapmalı asla hiç kullanılmamalıdır.
  • Öte yandan, ör. wait/notify Eski kodda kalabilir, ancak yeni kodda kullanılmamalıdır.

Kendi öznel düşüncem

Benim yorumum, bir şeyden vazgeçmenin bir yanlışlık olduğunu kabul etmekti ve bununla başlamak hiç de iyi değildi. Öte yandan, bir şeyin miras olarak sınıflandırılması, geçmişte yeterince iyi olduğunu kabul etmekle birlikte, amacına hizmet etti ve şimdiki zaman ve gelecek için artık yeterince iyi değil.


25
2018-05-20 11:49





Yaygın bir yorum, Kullanımdan Kaldırmanın yakın gelecekte kaldırılacağı anlamına gelir ve Mirası, geriye dönük uyumluluk veya diğer nedenler için kalacağı anlamına gelir.

Her ikisi de yeni kod tarafından kullanılmaması gerektiği anlamına gelir.

JDK söz konusu olduğunda, geri kalan uyumluluk Java JDK için çok önemli olduğu için, kullanımdan kaldırılmış kod da kalır.


13
2018-05-20 11:38



"Kullanımdan kaldırılmış" ın "yakın gelecekte kaldırılacağı" anlamına katılmadığına katılmıyorum. Sun hiçbir zaman yeni bir Java sürümünde kullanımdan kaldırılmış sınıfları veya yöntemleri kaldırmadı. - Jesper
@Jesper, inanıyorum ki, JDK'da her ikisi de kalacak, ancak diğer projelerde onaylanmamış kodlar sonunda kaldırılacak. - Timo Westkämper
Lütfen cevabınızı "kaldırılacak" durumunun her zaman böyle olmadığını belirtmek için düzenleyin. - java.is.for.desktop


Kullanımdan kaldırılma çoğu zaman, gelecekte işlevselliğin kaldırılmasına yönelik bir niyetin olduğunu belirtirken, miras sadece yeni bir kodda kullanılmamasını ima eder (eğer mümkün olsa bile olsa bile).


0
2018-05-20 11:39





Kullanımdan kaldırılan ek açıklama, kullanımdan kaldırılmış bir API'nin resmi bir tanımını verir. Eski sınıfların resmi bir tanımının mevcut olduğunu düşünmüyorum. Her ikisi de aslında sınıfın yeni kodda kullanılmaması gerektiği anlamına gelir.


0
2018-05-20 11:46





Bir önerim var - eski geçmişte yazılmış olan kod anlamına gelir, kullanımdan kaldırılmaması gereken önerilere atıfta bulunur. Artık kullanımdan kaldırılmış bir API kullanabilirsiniz, ancak eski kod yazamazsınız, şu an yazıyorsunuz. Sadece IMHO


0
2018-05-20 11:46





Deprecation, bunun kötü olduğu ve kullanılmaması gerektiği anlamına gelir - File.toURL() yoldaki boşlukları olan dosyalardan doğru URL'leri oluşturmadığından, en iyi örneklerden biridir. Sadece gerekeni yapmıyor, ancak varolan kod, hata düzeltildiyse kırılacak olan geçici çözümler kullanıyor olabilir

Mirası, sadece eski olduğu ve genel olarak, ancak zorunlu olarak daha iyi olmayan bir şey yapmanın yolları olduğu anlamına gelir. Vector iyi bir örnek - bu bir List uygulama, ancak hala, koleksiyon API'sından önceki günlerden bazı çirkin saçmalıklara sahip (yani, List) dizayn edildi. Aynı zamanda senkronize edilir, yani tek bir iş parçacığı senaryosunda kullanıldığında eşitleme ücretini ödemek zorunda olduğunuz anlamına gelir (VM'nin akıllı olduğu bazı durumlarda hariç). ArrayList senkronize edilmemiş olduğu için dizi destekli bir liste uygulaması istiyorsanız daha iyidir. Collections.synchronizedList tüm liste uygulamaları ile kullanılabilen bir sarıcı olduğundan senkronize edilmiş bir liste istediğinizde daha esnektir (bağlı listeler, listelerden Arrays.asList(T...), vb). Ancak, eğer yap senkronize, dizi destekli bir liste uygulaması yapmak Vector iyi.


0
2018-05-20 12:36



Tabii ki, bakmak için iyi bir fikir java.util.concurrent kullanmak yerine daha yeni koleksiyonlar için ad alanı Vector veya Hashtable... özellikle  Hashtable, gibi ConcurrentHashMap eşzamanlı senkronize edilmesine gerek kalmadan eş zamanlılık sağlar. - Powerlord
Kabul - synchronizedList et al, genellikle istediğin şey değil. - gustafc


Benim yorumum, Eski kodun işi daha iyi yapan daha yeni meslektaşlarına sahip olması. Bununla birlikte, hata düzeltmeleri ve diğer destek almaya devam edecektir. Öte yandan, onaylanmamış kod desteklenmez ve özel hata düzeltmeleri alamaz.


0
2018-05-20 14:30