Java 6'dan Java 7'ye geçiş nasıl doğrulanır?


28

Biz geçiş edildi Java 6 için Java 7 . Proje programın gerisinde ve riskler düşüyor, bu durumda Java 6 kullanmaya devam edecek.

Java 7’de yöneticimize geri dönüp JDK 7 kullanmanın önemli olduğuna ikna edebileceğimiz gelişmeler nelerdir? Oracle Java 7'de (Java 6'ya göre) vurgulayabileceğim hata düzeltmelerini arıyorum. Güvenlik, performans, Java 2D / yazdırma vb. İle ilgili düzeltmeler benim durumumda daha fazla satılabilir olacak. Örneğin derleyici düzeltmeleri çok fazla kullanılmayacak.

[ Oracle benimseme rehberi , hata veritabanı, Yığın Taşması ile ilgili sorular gibi birçok siteden geçiyorum ].

Güncelleme: Cevaplar için teşekkürler. Güncellemeyi bir sonraki sürüme ayarladık. En yakınımız güvenlikti. En yüksek oyu alan cevabı kabul etmek.


5
Şanslısın. Düzenli olarak Stack Overflow'ta ortaya çıkan sorulara bakılırsa , bazı insanlar hala Java 1.4'e (11 yaşında bir platform!) Takılmış durumda.
Joachim Sauer

3
İhtiyacınız olan 7'deki bazı özellikleri zaten bilmiyorsanız neden şimdi yükseltme yapıyorsunuz? Belki zaman harcıyorsun ve daha fazlası hakkında biraz düşünmek gerekir olup olmadığını sen ziyade haklı gerektiğini nasıl bunu haklı gerekir.
Bryan Oakley,

1
Sadece ben miyim, yoksa başlık geriye mı?
Radu Murzea

1
Daha büyük soru şudur: Neden bu kadar zor zaman yükseltmeleri yapıyorsunuz? Bir haftada bir milyon loc projesini Java 7'ye yükseltmeyi başardım. Sorunlarınızın cevabı, yükseltme işleminde neden bu kadar zorlandığınızı analiz etmek.
Andrew T Finnell

2
@ Andrew Finnell: Üzgünüm. Bunun ilgili olduğunu düşünmedim. Gerçek taşıma bir haftadan kısa bir sürede tamamlandı. Esas olarak güneşe özel api kullandığımız güneş yüzünden. Gerçek kod sayısından (yaklaşık 4 milyon) daha fazla etkilenen, işlev özelliğine uygun bir koddu. Bunun gecikmesi, araç desteği gibi çeşitli faktörlerden kaynaklanıyordu. Örneğin, cobertura 2.0 kullanan kod kapsamı. sadece dengeleniyor. Bir diğer araç ise yükseltme gerektiren Rational Functional Tester idi (yapmamayı tercih ettik).
Çalışmaları

Yanıtlar:


44

Java 6, bu yılın şubat ayında EOL'ye ulaştı ve çok pahalı kurumsal destek satın almadıkça, genel güncellemeleri (güvenlik dahil) almayacak.

Gereken tek şey bu olmalı.

Ayrıca, ezici kanıtlar Java çalışma zamanları için geriye dönük uyumluluğun mükemmel olduğunu göstermektedir. Muhtemelen, Java 6 kurulumlarını Java 7 ile değiştirmeniz yeterlidir ve tüm uygulamalar sorunsuz bir şekilde çalışmaya devam eder. Elbette bu garanti edilmez ve gerçekten bir sorun çıkmayacağını doğrulamak için kapsamlı testler önerilir.


2
bu kabul edilmiş bir cevap olmalıdır. EOL-tarihine dayalı akıl yürütme, özellikle Java da dahil olmak üzere belirli ürün güncellemelerini haklı gösterme ihtiyacı duyulduğunda benim için en iyi sonucu verdiğini kanıtladı. Gerekçelendirmeyi tamamlamak için, geriye dönük ikili uyumluluk hakkında notu (tercihen bazı resmi Oracle ifadeleriyle yedeklenmiş) ve güncellemeyi duman testine gerek duyma konusunda bir not ekleyeceğim (örneğin, versiyona kodlanmış referanslara beklenmeyen bağımlılıklar olması durumunda "" 6 "uygulama yapılandırmalarında)
gnat

1
Temelde çoğu şirketin yükseltme yapmasının tek nedeni bu.
jwenting

Michael, cevabınıza bahsettiğim notları ( uyumluluk ve duman testi ile ilgili açıklamalar) eklemek mantıklı olur mu? tamamlama uğruna, tabiri caizse
gnat

1
@gnat: bitti, ancak göçe karşı olan insanlara test ihtiyacından ve sadece duman testlerinden ziyade fazlasıyla anlatılması gerektiğinden şüpheliyim. Kesinlikle var olan bazen ciddi uyumsuzluklar.
Michael Borgwardt

@MichaelBorgwardt, bunu anlatması biraz zor bir şey ve teknik olarak doğru olmaktan ziyade zorlayıcı olmakla ilgili daha çok şey var. Birisi için, "değişime uğrayan" adamlar varken böyle şeyleri açıkça ve açıkça belirtmenin zor yolunu öğrendim. Bu tür bir mesaj gönderir, "endişelerinizi dinler ve paylaşırız, ayrıca endişeleniriz", değer vermelerini sağlar (görmezden gelenin aksine) ... ve sonunda değişimin daha kolay onaylanmasına yol açar :)
gnat

29

Genel olarak, programlayıcıda işleri kolaylaştırmak için oldukça geniş değişiklikler vardır. Yöneticiniz bu tür şeyleri çok fazla önemsemeyebilir, ancak programcıların kazan plaka kodunu düşünmek için daha az zaman harcamasını sağlamak ve bu nedenle uyguladıkları şeyin asıl amacı hakkında düşünmek için daha fazla zamana sahip olmak, verimliliği arttırmak, hataları azaltmak, vb. Bu çok güçlü bir argüman olabilir. Oracle oldukça geniş bir değişiklik listesine sahiptir , ancak oldukça uzundur, bu yüzden mümkün olduğunca özetleyeceğim.

Dil özellikleri şunlardır:

  • Jeneriklerde daha az kazanıyor. Kod Map<String, String> myMap = new HashMap<String, String>();azaltılabilir Map<String, String> myMap = new HashMap<>(). Derleyici, sol tarafta sağ tarafta ihtiyaç duyulan Genel türleri çıkartabilir, böylece kodunuz biraz daha kısa ve okunaklı hale gelir.
  • Dizeler artık.equals() yöntemin anlamını kullanarak yerine switch ifadelerinde çalışmaktadır== .
  • Kaynaklarla deneyin kullanarak otomatik kaynak yönetimi. Bu, kodu daha temiz hale getirir, ancak aynı zamanda eski stilde deneme / nihayet tabanlı kodlara göre avantaj sağlar. Try ifadesinde bir istisna atılırsa ve kapanırken bir başka atılırsa, geleneksel try / finally ifadelerini kullanan kod orijinal istisnayı tamamen kaybeder ve yalnızca nihayet blokta atılanı iletir. Bir try-with • ifadesinde, çalışma zamanı, close () çağrılarının attığı istisnayı bastırır ve bu orijinal istisnanın ilkinde tüm sorunlara neden olduğu varsayımı altında yığında orijinal istisnayı patlatır. yer. Ek olarak, diğer istisnaları çöp toplayıcıya bırakmak yerine, bu baskılama, yakın atılan istisnaların kullanılarak alınmasına izin verir Throwable.getSuppressed.
  • Sayısal değişmezlerin okunması daha kolay olabilir. Tüm sayısal hazır değerler alt çizgi çizmeye izin verir , bu yüzden bir şeyler int n = 1000000000daha okunaklı int n = 1_000_000_000hale getirilebilir, bir milyar olarak ayrıştırılması daha kolaydır ve fark etmeden yanlış yazması daha zordur. Ayrıca, ikili hazır bilgi formlarına izin verilir , bu 0b10110101da bit alanlarıyla çalışan kodun okunması biraz daha güzel olur.
  • Birden fazla istisna türünün kullanımı int, aynı catch ifadesi yapılabilir, çoğaltma kodunu azaltır ve potansiyel olarak daha sonra yeniden refaktör yapmayı kolaylaştırır.

Bu değişikliklerin her biri, yöneticinizin doğrudan umursamayacağı bir şeydir, ancak çaba harcamak ve düşünmeksizin doğru kodu yazmayı biraz kolaylaştırır, zihninizi biraz denediğiniz gerçek mantığa odaklanmak için biraz serbest bırakmanızı sağlar uygulamak ve ayrıca daha sonra kodu okumayı biraz daha kolaylaştırarak hata ayıklamayı biraz daha hızlı hale getirirler.

API tarafında, bir dizi API güncellemesi de meydana geldi:

  • Güvenlik açısından , kripto ileriye doğru hareket ederken, birkaç şifreleme yöntemi eklenmiştir / kullanımdan kaldırılmıştır.
  • IO dosyası değiştirildi ( bu daha iyi bir bağlantı olabilir ) , bazı yerlerde daha iyi bir soyutlama eklendi. Şahsen yeni IO olaylarına dalmadım, ama çok kullanışlı bir revizyon gibi gözüküyor, dosya sistemi ile çalışmayı çok daha fazla acı çekmeden kolaylaştırıyor.
  • Unicode Desteği , bir dizi diğer uluslararasılaşma geliştirmesinin yanı sıra Unicode 6.0'a kadardır.
  • Sorunuzda bahsettiğiniz Java2D geliştirildi. Daha iyi Linux font desteği, modern makinelerde daha iyi X11 sunumu ve Tibet betiklerinin kullanımı.

1
Nit pick: Aslında string switch " String.equalsmetodu kullanıyormuş gibi " çalışmaktadır (bağladığınız dökümandan). Gerçekte, derleyici, String.equalsnet etkinin aynı olması şartıyla kullanılmamak için optimize edilmekte özgürdür . (Ve, String.hashcodebelirli sayıda anahtar vakası üzerinde kullanacağını umuyorum.)
Stephen C

Yeterince doğru. Çoğu derleyicinin, anlambilimi değiştirmeyen bir ton optimizasyon yapmasına izin verilir , bu yüzden böyle küçük şeyleri işaret etmek çoğu zaman gereksizdir; Bu hususu göz ardı etmemek için açıkça .equals () 'den açıkça bahsetmiştim. Yine de, ifadeleri biraz güncelledim.
Billy Mailman

Dize anahtarları, bağlı olmayan bir etki alanında olduğunuz için pratik önerilmez. Enums'leri açmak, String benzeri bir gösterime sahip olabileceğiniz için tipik bir orta yoldur, fakat anlamsal bir anlam ifade eder. BTW'nin tamamı için Ah ve +1.
Martijn Verburg

Bir tamsayı sabitleri yerine bir switch ifadesinde dizeleri kullanmanın avantajları nelerdir?
Giorgio,

3
bunlar arasında tek iş nedeni güvenlik geliştirmeleri olabilir. Teknik tatlılar hem tartışmalı hem de iş adamları için tamamen alakasız.
jwenting

8

Kaynaklarıyla Dene , tümü için kendi başına Java 7'ye yükseltmeye değer bir özelliktir. Kaynak sızıntıları / bellek sızıntıları Java gelişiminde büyük risk taşır ve TWR bu riski önemli ölçüde azaltır.

Uygulamanızın Dosya / Ağ İletişimi I / O özellikleri varsa , yeni NIO.2 Dosya soyutlama ve Asenkron özelliklerinin de taşınmaya değer olduğunu ekleyeceğim .


Ayrıca gerekli PermGen miktarını azaltıyor ve bunun yerine Yığın veya yerel bellek kullanıyorlar, şimdi nerede depolanacağından emin değilim. Bu, Java 8 ile iki maksimum bellek parametresi ayarlamanıza gerek kalmayacağı anlamına gelir.
Andrew T Finnell

Kaynakları denemek için bir deneme-nihayet aynı ama daha az kazan ile değil mi?
jhewlett

1
Bence fikir, daha az kazanın doğru olması daha kolay olduğu anlamına geliyor.
MatrixFrog

1
Daha az kazan plakası ve doğru kapanma smeantiği. Onlar keşfetti içine OpenJDK el ile yanlış zamanda 2/3 hakkında yapıyorlardı .... ben kod diğer korpusundaki bu diğer yüksek yüzdelerde şüpheli.
Martijn Verburg

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.