Pomóż mi nadrobić zaległości od Java 1.4.2 [zamknięte]

14

Zaraz zacznę swoją pierwszą karierę zawodową jako programista i prawdopodobnie będę pisać dużo kodu Java. Nie wiem zbyt wiele o tym, co konkretnie będę pisać, a poza tym mam dość szerokie zainteresowania, jeśli chodzi o kod.

Z powodów, których nie warto omawiać, mój ostatni staż spowodował, że kodowałem tylko dla Java 1.3 i 1.4 SDK. Ponadto moje wykształcenie uniwersyteckie koncentrowało się głównie na algorytmach, strukturach danych i innych teoriach, a nie na funkcjach językowych i bibliotekach.

Mając powyższe na uwadze, jakie funkcje, klasy itp. W bieżącej wersji Javy (w każdym razie, w jakiej liczbie teraz jesteśmy?) Warto poświęcić mój czas na zapoznanie się i dlaczego? Czego mi brakowało od 1.4.2, co ułatwia Ci życie programisty?

Świetne byłyby również przykłady i historie, w jaki sposób odkryłeś konkretną paczkę lub ją wykorzystałeś.

DGH
źródło
4
Z jakich powodów nie warto dyskutować? Wielu z nas jest zaintrygowanych ...
5arx
@ 5arx Cóż, pracowałem z wersją java 1.4 dla programowania robotyki, ponieważ z jakiegoś powodu była to obsługiwana przez naszą platformę.
Daniel Gratzer

Odpowiedzi:

15

Najważniejsze zmiany, które uważam za:

  • Ogólne (np. Zbiory maszynowe, takie jak Set)

  • Ulepszono dla pętli (dla (String s: set) {...})

  • Autoboxing / unboxing (automatyczna konwersja między typami takimi jak Integer na int i odwrotnie)

  • Typesafe wyliczenia (enum jest teraz słowem kluczowym, typy można tworzyć z wyliczeń)

  • Varargs (dla funkcji printf (), pozwala na zmienną liczbę argumentów)

  • Import statyczny (może teraz importować metody statyczne klasy, takie jak java.lang.Math)

  • Adnotacje

  • java.util.concurrent (pokazuje współbieżność Java)

Przeczytaj także, do czego chcesz Java? , aby lepiej zrozumieć każdą z trzech wersji.

ykombinator
źródło
1
++ Ulepszone dla pętli, autoboxing / unboxing, varargs, import statyczny są proste
Michael Wiles
Dlaczego programiści Java nazywają dla każdej pętli „ulepszoną forpętlę”?
Maks.
2
@Maxpm Ponieważ tak to się nazywa w specyfikacji języka Java. Zgodnie z JLS istnieją podstawowe dla pętli i ulepszone dla pętli. Nie jestem pewien, dlaczego postanowili to zrobić w ten sposób. Może dlatego, że składnia nie używa specjalnego słowa kluczowego i w pewnym sensie wtapia się w normalne pętle.
Malcolm
10

Jedną najważniejszą zmianą w codziennym życiu programistycznym jest wprowadzenie generycznych, które najprawdopodobniej zostaną wykorzystane w każdym nowym module, o który poprosimy Cię o napisanie, i jest to myląca nowa składnia.

Generics to mechanizm umożliwiający np List zawieranie ciągów zamiast nagich obiektów, gdzie kompilator wymusza, aby element do umieszczenia na liście był ciągiem, i wie, że kiedy wyciągasz element z listy, jest to ciąg .

Dzięki temu powstają lepsze programy, ponieważ unika się jawnego przesyłania środowiska uruchomieniowego na typ docelowy (który jest częstym źródłem błędów, jeśli się pomylisz), a IDE może pomóc wykonać całą brudną robotę, ponieważ wie znacznie więcej o kodzie niż stało się tak, gdy była to tylko lista obiektów.

Joshua Bloch napisał dobre wprowadzenie do Generics, które jest dostępne jako przykładowy rozdział na stronie http://java.sun.com/docs/books/effective/


źródło
Proszę, NIE mów Groovy ludziom! „Dzięki temu powstają lepsze programy, ponieważ unika się przesyłania środowiska wykonawczego do typu docelowego”. def whatever....
Dan Rosenstark,
@Yar, zredagowane w celu uzyskania większej przejrzystości Ja kocham ten „def” lub atrybut „zmienna”. Ułatwiłoby mi życie.
Tak, właśnie tak właśnie myślałem z Objective-C i tym, idco jest deflub var.... ale z drugiej strony, bezpieczeństwo 100% pisania statycznego jest niesamowite.
Dan Rosenstark,
@Yar: Pokochasz Adę :)
mattnz
@mattnz dlaczego, szczególnie? A skoro już tu jesteśmy, czy działa na JVM?
Dan Rosenstark
6

Autoboxing to miła funkcja wprowadzona w Javie 5. Podobnie jak w języku C #, kompilator dokonuje teraz automatycznej konwersji między typami pierwotnymi (podstawowymi) i odpowiadającymi im klasami opakowań obiektów (int na Integer itp.) Iz powrotem. To sprawia, że ​​praca z kolekcjami Java jest znacznie mniej uciążliwa.

Wydaje mi się, że pętla For-each była również nowa w Javie 5. Ułatwia to iterację po tablicach (i kolekcjach), ponieważ eliminuje wiele zwykłego bałaganu związanego z konfiguracją i zarządzaniem zmienną indeksu lub iteratorami. Na przykład:

void myMethod(Collection<myObjectType> c) {
    for (myObjectType o : c)
        o.foo();
}
Promień
źródło
6

Wyliczenia , aby zastąpić ostateczną statykę i stałe oraz pomóc usunąć odniesienia do łańcuchów i liczb magicznych. Przykład wzięty od dobrych ludzi ze Słońca / Wyroczni :

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();
    }
}

i

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));
    }
Nim Chimpsky
źródło
6

java.util.concurrent został wprowadzony w wersji 1.5. Najlepszym źródłem do nauki jest (prawdopodobnie) książka Java Concurrency in Practice . Współbieżność IMHO jest najważniejszą przewagą konkurencyjną Javy w porównaniu do czegokolwiek innego, więc zdecydowanie warto ją dobrze poznać.

Joonas Pulakka
źródło
1
+1 Za wzmiankę o pakiecie współbieżnym. To smutne, że tak wielu programistów nadal używa prymitywów współbieżności, takich jak Wątki, czekaj () / powiadom () i synchronizuj ...
Oliver Weiler
W rzeczy samej. java.util.concurrentprymityw współbieżności jest jak automatyczne zarządzanie pamięcią do ręcznego zarządzania pamięcią. Korzystanie z tego drugiego jest tylko receptą na poświęcenie więcej czasu na debugowanie i nie oferuje żadnych korzyści.
Joonas Pulakka
Kat na ratunek! Jeszcze lepiej w Javie 6
+1000 gdybym mógł - ta książka jest niesamowita
Gary Rowe
4

Cóż, StringBuilderbardzo mi pomógł, aby przyspieszyć mój program. Jest to odpowiednik StringBufferbezpieczeństwa bez wątku.

duros
źródło
Tak. Skuteczne Java stwierdza, że ​​StringBuffer jest przestarzały i powinien zostać zastąpiony przez StringBuilder.
Gary Rowe,
1
Łączenie +łańcuchów automatycznie używa StringBuilder zamiast StringBuffer dla poziomu źródłowego 1.5 i wyższego.
4

Pomogę, kategoryzując pomocną odpowiedź od @ykombinator. Jego lista to lista elementów, z których będziesz korzystać na co dzień, wykonując „ogólne” prace rozwojowe w Javie.

Mały wpływ i niski poziom trudności:

  • Ulepszono dla pętli (dla (String s: set) {...})
  • Autoboxing / unboxing (automatyczna konwersja między typami takimi jak Integer na int i odwrotnie)
  • Varargs (dla funkcji printf (), pozwala na zmienną liczbę argumentów)
  • Import statyczny (może teraz importować metody statyczne klasy, takie jak java.lang.Math)

Wysoki wpływ i średni poziom trudności:

  • Typesafe wyliczenia (enum jest teraz słowem kluczowym, typy można tworzyć z wyliczeń)

Wysoki wpływ i trudność:

  • Adnotacje
  • Generics

Niski wpływ i wysoki trudny (będzie używany tylko, jeśli nie wykonasz zaawansowanego gwintowania)

  • java.util.concurrent (pokazuje współbieżność Java)

Proponuję zatem, abyś przeczytał dokumentację / pomoc na temat mało trudnych i mało trudnych elementów - są łatwe do odebrania. Poświęć trochę czasu na adnotacje i ogólne - adnotacje są bardzo przydatne, a ogólne mogą się komplikować.

Spójrz na nową zawartość współbieżności tylko wtedy, gdy chcesz wykonać wątki.

Michael Wiles
źródło
4

Ponieważ nie mogę komentować, ponieważ mam mniej niż 50 lat, zostawię odpowiedź. Zostało już wspomniane, ale powtórzę to jeszcze raz: Adnotacje! Tego rodzaju metadane stały się najważniejszą rzeczą w moich latach doświadczenia w Javie. Jest dobrze używany, podobnie jak niektóre frameworki, dzięki czemu kod jest znacznie bardziej zwięzły i czysty. Na przykład adnotacje mogą:

  • Przekształć obiekt w byt @Entity
  • Konwertuj metodę na usługę REST @GET
  • Wyjaśnij, że metoda nigdy nie zwróci null @ nonnull
  • Ustaw obiekt na pole do wstrzykiwania zależności @inject

Oczywiście możesz budować własne adnotacje i wiedzieć, czy metoda, klasa lub pole są adnotowane za pomocą odbicia.

Luciano
źródło
2
Aby być precyzyjnym, adnotacje nie mogą robić tych rzeczy, ponieważ po prostu umieszczają meta-informacje w kodzie, na które inny kod - często specjalny moduł ładujący - może podjąć działania. Uważam adnotacje za bardzo dobre ogólne rozwiązanie wielu problemów.
3

Uczenie się przez przykład działa dla mnie

Oto szybki przykład idiomatycznej Java 6

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);

  }
}

Nie przejmuj się Javą 5, jest przestarzała w stosunku do Java6.

Następny krok, adnotacje. Po prostu definiują one aspekty twojego kodu, które pozwalają czytającym adnotacje na wypełnienie dla Ciebie konfiguracji szablonów. Rozważ prostą usługę internetową, która wykorzystuje specyfikację JAX-RS (rozumie RESTful URI). Nie chcesz zawracać sobie głowy robieniem wszystkich paskudnych WSDL i zabawą z Axis2 itp., Chcesz szybki wynik. Racja, zrób to:

// 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();
  }
}

Huk. Z odrobiną magii konfiguracyjnej w pliku web.xml jesteś wyłączony. Jeśli budujesz z Maven i masz skonfigurowaną wtyczkę Jetty, twój projekt będzie miał swój własny mały serwer sieciowy od razu po wyjęciu z pudełka (bez zbędnych kłopotów z JBoss lub Tomcat), a powyższy kod będzie odpowiadał na identyfikatory URI Formularz:

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

Zadanie wykonane.

Gary Rowe
źródło
3

Wow, to był podmuch z przeszłości! Nie korzystam z Javy od 4 lat - w tym czasie nic się nie zmieniło!

Istnieje lista funkcji według wersji , ale tutaj jest ważny (oczywiście plagiat) ...

J2SE 5.0 (30 września 2004 r.)

  • Ogólne: Zapewnia bezpieczeństwo typu kompilacji (statyczne) dla kolekcji i eliminuje potrzebę większości rzutów (konwersja typów).
  • Metadane: nazywane także adnotacjami; umożliwia oznaczanie konstrukcji językowych, takich jak klasy i metody, dodatkowymi danymi, które mogą być następnie przetwarzane przez narzędzia rozpoznające metadane.
  • Autoboxing / unboxing: Automatyczne konwersje między typami pierwotnymi (takimi jak int) i pierwotnymi klasami opakowań (takimi jak Integer).
  • Wyliczenia: Słowo kluczowe enum tworzy bezpieczną, uporządkowaną listę wartości (takich jak Dzień.MONDAY, Dzień.TUESDAY itp.). Wcześniej można to było osiągnąć tylko za pomocą stałych liczb całkowitych innych niż bezpieczne lub ręcznie skonstruowanych klas (bezpieczny wzór typów).
  • Swing: nowy wygląd i styl, zwany syntezatorem.
  • Varargs: Ostatni parametr metody można teraz zadeklarować za pomocą nazwy typu, po której następują trzy kropki (np. Pusty tekst rysunkowy (linie ...). W kodzie wywołującym można użyć dowolnej liczby parametrów tego typu, a następnie są one umieszczane w tablicy, która ma zostać przekazana do metody, lub alternatywnie kod wywołujący może przekazać tablicę tego typu.
  • Ulepszone dla każdej pętli: Składnia pętli for jest rozszerzona o specjalną składnię do iteracji po każdym elemencie tablicy lub dowolnej iterowalnej, takiej jak standardowe klasy Collection, za pomocą konstrukcji o postaci:

Java SE 6 (11 grudnia 2006 r.)

  • Usunięto obsługę starszych wersji Win9x. Nieoficjalnie Java 6 Update 7 to ostatnia wersja Java pokazana do pracy w tych wersjach systemu Windows. Uważa się, że jest to spowodowane poważnymi zmianami w aktualizacji 10.
  • Obsługa języka skryptowego: ogólny interfejs API do ścisłej integracji z językami skryptowymi oraz wbudowana integracja z Rhino Mozilla JavaScript
  • Znaczące ulepszenia wydajności dla platformy podstawowej i Swing.
  • Ulepszona obsługa usług sieciowych za pośrednictwem JAX-WS
  • Obsługa JDBC 4.0.
  • Java Compiler API interfejs API pozwalający programowi Java na wybieranie i wywoływanie kompilatora Java programowo.
  • Aktualizacja JAXB do wersji 2.0: W tym integracja parsera StAX.
  • Obsługa adnotacji wtykowych
  • Wiele ulepszeń GUI, takich jak integracja SwingWorker z API, sortowanie i filtrowanie tabel oraz prawdziwe podwójne buforowanie Swing (eliminujące efekt szarej strefy).
  • Udoskonalenia JVM obejmują: synchronizację i optymalizację wydajności kompilatora, nowe algorytmy i aktualizacje istniejących algorytmów wyrzucania elementów bezużytecznych oraz wydajność uruchamiania aplikacji.

O to chodzi. Java SE 7.0 wygląda bardziej interesująco, ale nie została jeszcze wydana.

Biorąc pod uwagę, ile nowych funkcji językowych i interfejsów API zostało dodanych do C # w ciągu ostatnich 4 lat, jestem dość zaskoczony. Co się dzieje w Sun / Oracle?

sheikhjabootie
źródło
Sun zdecydował się na open source Java. To rzeczą, która sprawiła, że bez względu na to, co Oracle zdecyduje się robić nadal możemy uruchomić OpenJDK na polach Linux. To tylko opóźniło ich 18-24 miesięcy ...
@ Thorbjørn - to może to wyjaśnić. Szkoda, ile zakłóceń spowodowało to przejęcie. Wydaje mi się, że C # cieszy się względną stabilnością: mamy lambdy od 2006 roku - gdzie, jak wyglądają, nie wejdą na Javę do 2012 roku.
sheikhjabootie