Java 1.4.2'den beri kaçırdığım şeyleri yakalamama yardım et [kapalı]


14

Bir yazılım geliştiricisi olarak ilk profesyonel kariyer pozisyonuma başlamak üzereyim ve muhtemelen bir çok Java kodu yazacağım. Özellikle ne yazacağım hakkında o kadar çok şey bilmiyorum ve ayrıca, kodlama söz konusu olduğunda oldukça geniş ilgi alanlarım var.

Tartışmaya değmez nedenlerden dolayı, son stajım sadece Java 1.3 ve 1.4 SDK'larını kodlamamı sağladı. Ayrıca, üniversite eğitimim dil özellikleri veya kütüphanelere değil, esas olarak algoritmalara, veri yapılarına ve diğer teorilere odaklanmıştır.

Bu nedenle, yukarıdakileri göz önünde bulundurarak, Java'nın şu anki sürümünde hangi özellikler, sınıflar, vb. 1.4.2'den beri programcı olarak hayatınızı kolaylaştıran neyi kaçırdım?

Belirli bir paketi veya bazılarını nasıl keşfettiğinize ve kullanmaya nasıl koyduğunuza dair örnekler ve hikayeler de harika olurdu.


4
Tartışmaya değmeyen bu nedenler nelerdir? Birçoğumuz ilgimizi
çekiyor

@ 5arx Peki Robotik Programlama için bir java 1.4 sürümü ile çalıştım çünkü bir nedenden dolayı platformumuz bunu destekliyordu.
Daniel Gratzer

Yanıtlar:


15

En önemli olduğunu düşündüğüm değişiklikler:

  • Jenerikler (örneğin Set gibi yazılan koleksiyonlar)

  • Döngü için geliştirildi ((String s: set) {...})

  • Otomatik kutulama / kutudan çıkarma (Tamsayı gibi türler arasında otomatik olarak int ve tersi arasında dönüştürme)

  • Typesafe enums (enum artık bir anahtar kelime, sıralamalar dışında türler oluşturulabilir)

  • Varargs (printf () işlevi için değişken sayıda bağımsız değişkene izin verir)

  • Statik içe aktarma (artık java.lang.Math gibi bir sınıfın statik yöntemlerini içe aktarabilir)

  • Açıklamalar

  • java.util.concurrent (Java'nın eşzamanlılığını gösterir)

Ayrıca hangi Java'yı hedefliyorsunuz? Başlıklı konuyu okuyun. , her üç versiyonu daha iyi anlamak için.


1
++ döngü, otomatik kutulama / kutudan çıkarma, varargs, statik içe aktarma için geliştirilmiş basittir
Michael Wiles

Java programcıları neden her döngüyü "gelişmiş fordöngüler" olarak adlandırır?
En fazla

2
@Maxpm Çünkü Java Dil Spesifikasyonu'nda böyle adlandırılır. JLS'ye göre, döngüler için temel ve döngüler için geliştirilmiştir. Neden böyle yapmaya karar verdiklerinden emin değilim. Belki de sözdizimi özel bir anahtar kelime ve normal döngülerle bir tür karışım kullanmadığından.
Malcolm

10

Günlük programlama hayatınızdaki en önemli tek değişiklik , büyük olasılıkla yazmanız istenecek her yeni modülde kullanılacak jeneriklerin tanıtılmasıdır ve kafa karıştırıcı yeni bir sözdizimidir.

Generics, örneğin a'nın Listçıplak nesneler yerine dizeleri içermesine izin veren mekanizmadır ; burada derleyici listeye konacak bir öğenin Dize olduğunu zorlar ve listeden bir öğe aldığınızda bunun bir Dize olduğunu bilir .

Bu, hedef türüne (çalışma sırasında yanlış yaparsanız sık sık hata kaynağıdır) açık çalışma zamanını önlediğinizden daha iyi programlar sağlar ve IDE, kodunuz hakkında çok daha fazla şey bildiği için tüm kirli işleri yapmanıza yardımcı olabilir. sadece nesnelerin listesi olduğu zaman yaptı.

Joshua Bloch, http://java.sun.com/docs/books/effective/ adresinde yer alan Generics'e iyi bir giriş yazdı.


Lütfen Groovy insanlara söyleme! "Bu, hedef türüne çalışma zamanının kullanılmasını engellediğiniz için daha iyi programlar sağlar." def whatever....
Dan Rosenstark

@Yar, daha açık olacak şekilde düzenlendi. Ben "def" veya "var" özniteliğini SEVİYORUM . Hayatımı biraz daha kolaylaştıracaktı.

Evet, bunu son zamanlarda Objective-C ve idhangisi ile düşünüyordum defya da var.... ama sonra tekrar,% 100 statik yazmanın güvenliği gerçekten şaşırtıcı.
Dan Rosenstark

@Yar: Ada'yı seveceksin :)
mattnz

@mattnz neden, özellikle? Ve biz buradayken, JVM'de çalışıyor mu?
Dan Rosenstark

6

Otomatik boks , Java 5 ile sunulan hoş bir özelliktir. Tıpkı C # 'da olduğu gibi, derleyici şimdi ilkel (temel) tipler ve karşılık gelen nesne sarmalayıcı sınıfları (int Tamsayıya vb.) Ve tekrar geri arasında otomatik bir dönüşüm yapar. Bu, Java Koleksiyonlarıyla çalışmayı daha az acı verici hale getirir.

Her döngü Java 5 için de yeni, sanırım. Diziler (ve koleksiyonlar) üzerinde yinelemeyi kolaylaştırır, çünkü bir dizin değişkeninin veya yineleyicilerin kurulumunu ve yönetimini içeren olağan karmaşayı ortadan kaldırır. Örnek olarak:

void myMethod(Collection<myObjectType> c) {
    for (myObjectType o : c)
        o.foo();
}

6

Numaralar , son statik ve sabitleri değiştirmek ve dizelere ve sihirli sayılara referansları kaldırmanıza yardımcı olur. Güneş / kehanette iyi insanlardan alınan bir örnek :

public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7),
    PLUTO   (1.27e+22,  1.137e6);

    private final double mass;   // in kilograms
    private final double radius; // in meters
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    public double mass()   { return mass; }
    public double radius() { return radius; }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    public double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    public double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
}

ve

public static void main(String[] args) {
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }

6

java.util.concurrent 1.5'te tanıtıldı. Öğrenmek için en iyi kaynak (muhtemelen) Uygulama kitabındaki Java Eşzamanlılığı'dır . IMHO eşzamanlılığı, Java'nın başka herhangi bir şeye kıyasla en önemli rekabet avantajıdır, bu yüzden kesinlikle iyi bilmeye değer.


1
+1 Eşzamanlı paketten bahsetmek için.Çok geliştiricinin hala Threads, wait () / notify () ve senkronize et gibi eşzamanlılık ilkellerini kullanması üzücü ...
Oliver Weiler

Aslında. java.util.concurrenteşzamanlılık ilkelleri manuel bellek yönetimine otomatik bellek yönetimi gibidir. İkincisini kullanmak, hata ayıklamaya daha fazla zaman harcamak için bir reçetedir ve hiçbir avantaj sunmaz.
Joonas Pulakka

Kurtarma icracıları! Java 6'da daha da iyi

Mümkünse +1000 - bu kitap inanılmaz
Gary Rowe

4

Eh, StringBuilderbenim programı hızlandırmak için bana yardımcı oldu. StringBufferİplik emniyetinin eşdeğeridir .


Evet. Etkili Java, StringBuffer'ın eski olduğunu ve bunun yerine StringBuilder ile değiştirilmesi gerektiğini belirtir.
Gary Rowe

1
İle Birleştirme +dizeleri otomatik kaynak düzeyinde 1.5 ve üzeri için StringBuilder yerine StringBuffer kullanmaktadır. Buna

4

@Ykombinator'dan gelen yardım cevabını kategorilere ayırarak yardımcı olacağım. Onun listesi "genel" java geliştirme yaparken günlük olarak kullanacağınız öğelerin bir listesidir.

Düşük etki ve düşük zorluk seviyesi:

  • Döngü için geliştirildi ((String s: set) {...})
  • Otomatik kutulama / kutudan çıkarma (Tamsayı gibi türler arasında otomatik olarak int ve tersi arasında dönüştürme)
  • Varargs (printf () işlevi için değişken sayıda bağımsız değişkene izin verir)
  • Statik içe aktarma (artık java.lang.Math gibi bir sınıfın statik yöntemlerini içe aktarabilir)

Yüksek Etki ve orta zorluk:

  • Typesafe enums (enum artık bir anahtar kelime, sıralamalar dışında türler oluşturulabilir)

Yüksek Etki ve yüksek zorluk:

  • Açıklamalar
  • Jenerik

Düşük etki ve yüksek zor (yalnızca gelişmiş diş çekme işlemi yapmazsanız kullanılır)

  • java.util.concurrent (Java'nın eşzamanlılığını gösterir)

Bu nedenle dokümanlar üzerinden okumanızı / düşük etkili düşük zor parçalara yardım etmenizi öneririm - toplanması kolaydır. Ek Açıklamalar ve Jenerikler için çok zaman harcayın - ek açıklamalar çok faydalıdır ve jenerikler oldukça karmaşık olabilir.

Yeni eşzamanlılık içeriğine yalnızca iplik geçirmeniz gerekiyorsa bakın.


4

Yorum yapamadığım için 50 yaşın altında olduğum için bir cevap bırakacağım. Zaten bahsedildi ama tekrarlayacağım: Ek açıklamalar! Bu tür meta veriler, yıllar süren Java deneyimimdeki en önemli şey haline geldi. Bazı çerçeveler gibi iyi kullanılır, kodu çok daha özlü ve temiz hale getirir. Örneğin, ek açıklamalar şunları yapabilir:

  • Bir nesneyi @Entity öğesine dönüştürme
  • Bir yöntemi bir REST hizmetine dönüştürme @GET
  • Bir yöntemin asla null @nonnull döndürmeyeceğini açıklayın
  • Bağımlılık enjeksiyonu için bir alana nesne ayarlama @inject

Ve elbette kendi ek açıklamalarınızı oluşturabilir ve bir yöntemin, sınıfın veya alanın yansıma kullanarak açıklanıp açıklanmadığını öğrenebilirsiniz.


2
Tam olarak açıklamak gerekirse, diğer bilgileri - genellikle özel bir sınıf yükleyici - koda meta bilgi koydukları için bu bilgileri yapamazlar. Ek açıklamaların birçok soruna çok iyi bir genel çözüm olduğunu düşünüyorum.

3

Örnekle öğrenmek benim için çalışıyor

İşte deyimsel Java 6'ya hızlı bir örnek

public class Main {
  public static void main(String[] args) {
    // Shows a list forced to be Strings only
    // The Arrays helper uses generics to identify the return type
    // and takes varargs (...) to allow arbitary number of arguments
    List<String> genericisedList = Arrays.asList("A","B","C");

    // Demonstrates a for:each loop (read as for each item in genericisedList)
    for (String item: genericisedList) {
      System.out.printf("Using print formatting: %s%n",item);
    }

    // Note that the object is initialised directly with a primitive (autoboxing)
    Integer autoboxedInteger = 1;
    System.out.println(autoboxedInteger);

  }
}

Java5 ile uğraşmayın, Java6 ile ilgili olarak kullanımdan kaldırılmıştır.

Sonraki adım, ek açıklamalar. Bunlar, kodunuzun ek açıklama okuyucularının sizin için şablon plakası yapılandırmasını doldurmasına izin veren yönlerini tanımlar. JAX-RS spesifikasyonunu kullanan basit bir web servisini düşünün (RESTful URI'ları anlar). Tüm kötü WSDL'yi yapmak ve Axis2 vb.Ile uğraşmak istemezsiniz, hızlı bir sonuç istersiniz. Doğru, bunu yap:

// Response to URIs that start with /Service (after the application context name)
@Path("/Service")
public class WebService {

  // Respond to GET requests within the /Service selection
  @GET
  // Specify a path matcher that takes anything and assigns it to rawPathParams
  @Path("/{rawPathParams:.*}")
  public Response service(@Context HttpServletRequest request, @PathParam("rawPathParams") String rawPathParams) {
    // Do some stuff with the raw path parameters 

    // Return a 200_OK
    return Response.status(200).build();
  }
}

Patlama. Web.xml dosyasındaki yapılandırma sihrinin biraz serpintisiyle kapalısınız. Maven ile inşa ediyorsanız ve Jetty eklentisini yapılandırdıysanız, projeniz kutusundan çıkar çıkmaz kendi küçük web sunucusuna sahip olacaktır (sizin için JBoss veya Tomcat ile uğraşmanıza gerek yoktur) ve yukarıdaki kod, form:

GET http://localhost:8080/contextName/Service/the/raw/path/params

İş bitmiş.


3

Vay be bu geçmişten gelen bir patlama oldu! Java'yı 4 yıldır kullanmadım - ve o zaman hiçbir şey değişmedi!

Sürüme göre özelliklerin bir listesi var , ancak işte önemli bit (tabii ki intihal) ...

J2SE 5.0 (30 Eylül 2004)

  • Jenerikler: Koleksiyonlar için derleme zamanı (statik) tipi güvenlik sağlar ve çoğu daktilo ihtiyacını ortadan kaldırır (tip dönüştürme).
  • Meta veriler: Ek açıklamalar da denir; sınıflar ve yöntemler gibi dil yapılarının ek verilerle etiketlenmesine izin verir ve bunlar meta verilere duyarlı yardımcı programlar tarafından işlenebilir.
  • Otomatik kutulama / kutudan çıkarma: İlkel türler (int gibi) ve ilkel sarmalayıcı sınıfları (Tamsayı gibi) arasındaki otomatik dönüşümler.
  • Numaralandırma: enum anahtar sözcüğü, tür güvenli, sıralı bir değerler listesi oluşturur (Day.MONDAY, Day.TUESDAY, vb.). Daha önce bu sadece tipefefe olmayan sabit tamsayılar veya manuel olarak inşa edilmiş sınıflar (typesafe enum paterni) ile başarılıyordu.
  • Salıncak: Synth adı verilen yeni kaplanabilir görünüm ve his.
  • Varargs: Bir yöntemin son parametresi şimdi bir tür adı ve ardından üç nokta (örn. Void drawtext (String ... lines)) kullanılarak bildirilebilir. Arama kodunda, bu tipte herhangi bir sayıda parametre kullanılabilir ve daha sonra, yönteme iletilmek üzere bir diziye yerleştirilir veya alternatif olarak, arama kodu bu tipte bir diziyi iletebilir.
  • Her döngü için geliştirilmiş: for döngüsü sözdizimi, bir dizinin veya standart Koleksiyon sınıfları gibi herhangi bir Yinelenebilir öğenin her bir üyesinin formun bir yapısını kullanarak yinelemesi için özel sözdizimi ile genişletilir:

Java SE 6 (11 Aralık 2006)

  • Eski Win9x sürümleri için destek kesildi. Gayri resmi olarak Java 6 Güncelleme 7, Windows'un bu sürümlerinde çalıştığı gösterilen Java'nın son sürümüdür. Bunun Güncelleme 10'daki büyük değişikliklerden kaynaklandığına inanılıyor.
  • Komut Dosyası Dil Desteği: Komut dosyası dilleriyle sıkı entegrasyon ve yerleşik Mozilla JavaScript Rhino entegrasyonu için genel API
  • Çekirdek platform ve Swing için dramatik performans geliştirmeleri.
  • JAX-WS ile geliştirilmiş Web Hizmeti desteği
  • JDBC 4.0 desteği.
  • Java Derleyici API'si Bir Java programının bir Java Derleyicisini program aracılığıyla seçmesine ve çağırmasına izin veren bir API.
  • JAXB'nin sürüm 2.0'a yükseltilmesi: Bir StAX ayrıştırıcısının entegrasyonu dahil.
  • Takılabilir ek açıklamalar için destek
  • SwingWorker'ın API'ye entegrasyonu, tablo sıralama ve filtreleme ve gerçek Swing çift tamponlama (gri alan efektini ortadan kaldırma) gibi birçok GUI iyileştirmesi.
  • JVM iyileştirmeleri şunları içerir: senkronizasyon ve derleyici performans optimizasyonları, yeni algoritmalar ve mevcut çöp toplama algoritmalarına yükseltme ve uygulama başlatma performansı.

Bu kadar. Java SE 7.0 daha ilginç görünüyor ancak henüz yayınlanmadı.

Son 4 yılda C #'a kaç yeni dil özelliği ve API eklendiği düşünüldüğünde, hayretler içinde kaldım. Sun / Oracle'da neler oluyor?


Sun açık kaynaklı Java'yı kullanmaya karar verdi. Bu Oracle yapmaya karar ne olursa olsun biz hala Linux kutularında OpenJDK çalıştırabilirsiniz sağlamıştır şey. Bu sadece 18-24 ay erteledi ...

@ Thorbjørn - bu açıklayabilir. Bu satın almanın ne kadar aksamaya neden olduğu utanç verici. Sanırım C # karşılaştırmalı istikrara sahip: 2006'dan beri lambdalarımız var - şimdi 2012'ye kadar Java'ya girmeyecekleri gibi.
sheikhjabootie
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.