niedziela, 28 marca 2010

JDK 7 - nowości 2

Ciągniemy dalej nasze zapoznawanie się z JDK7. W dzisiejszym odcinku to co wszystkich dotyczy i interesuje chyba najbardziej, czyli zmiany w języku Java.

Zmiany w języku Java

  • JSR 294: Wsparcie w języku i JVM dla programowania modułowego
  • Moduły (czyli "superpackage" jak były nazywane na początku) zwiększają możliwości kontroli dostępu dla obiektów. Do tej pory jeżeli budowaliśmy jakieś biblioteki które składały się z wielu pakietów deklaracja dostępu "package" ograniczała nas tylko do pakietu i jego podpakietów. A jeżeli chciało się sięgnąć między dwoma równoległymi "podpakietami" trzeba było deklarować to jako "public" czyli udostępnić też na zewnątrz biblioteki. Moduły pomogą to rozwiązać przez nowe słowo kluczowe "module", które będzie występowało w pliku przed definicją "package". Do tego będzie można zastosować nowy modyfikator dostępu "module". Będzie to ciekawe wsparcie dla systemów modułowych jak OSGI czy Jigsaw. Więcej można poczytać tu: http://blogs.sun.com/abuckley/resource/JSR294AndModuleSystems.pdf.
  • JSR308 - rozszerzenie annotacji
  • Od JDK7 annotacje zyskają dodatkowy wymiar, będzie je można używać w wielu nowych miejscach. Popatrzmy na możliwości np:
    @NonNull String  //zadeklarowanie zmiennej ktora nie moze byc nullem
    List<@NotNull String> //Listy nie przyjmujacej null
    List<@Longer(max=6) String> //Listy przyjmujacej stringi dluzsze niz
    String @NonEmpty [] //Nie pustej tablicy
    
      @Readonly Document [][] docs1 = new @Readonly Document [2][12]; // tablica tablic zawierajacych dokumenty tylko do odczytu
      Document @Readonly [][] docs2 = new Document @Readonly [2][12]; // tylko do odczytu tablica tablic z dokumentami
      Document[] @Readonly [] docs3 = new Document[2] @Readonly [12]; // tablica zlozona z tablic tylko do odczytu z dokumentami
    boolean isNonNull = myString instanceof @NonNull String; //test czy nie null
    
  • Project Coin - czyli małe zmiany w języku Java ułatwiające prace
  • Tak jak w wcześniejszym poście pisałem są to małe zmiany w języku Java zaproponowane przez programistów.
    • Używanie String w instrukcji switch
    • String klucz="kluczyk";
      switch(klucz){
        case "":
          System.out.println("Pusty");
          break;
        case "kluczyk":
          System.out.println("Znalazlem kluczyk");
          break;
        default: break;
      }
      
    • Automatic Resource Management
    • To już ciekawostka - automatyzacja zamykania strumieni (lub innych zasobów z metodą close). Do tej pory przy zasobach należało pilnować zamknięcia w finally. np:
      static String readFirstLineFromFile(String path) throws IOException {
              BufferedReader br = new BufferedReader(new FileReader(path));
              try {
                  return br.readLine();
              } finally {
                  br.close();
              }
          }
      
      W propozycji rozszerzamy instrukcje try przez umożliwienie jej przyjęcia zmiennych lokalnych z interfejsem Disposable, który deklaruje metodę close(). Ta metoda będzie automatycznie wywołana przy wychodzeniu z try.
      static String readFirstLineFromFile2(String path) throws IOException {
              try (BufferedReader br = new BufferedReader(new FileReader(path)) {
                 return br.readLine();
              }
          }
      
    • Notacja diament ("diamond")
    • Uproszczenie składni:
      Map<String, List<String>> anagrams = new HashMap<String, List<String>>(); //standardowa notacja
      Map<String, List<String>> anagrams = new HashMap<>(); //notacja diament
      
    • Małe zmiany w składni stałych numerycznych: podkreślnik i zapis binarny
    • int a=20_000_000_000; //przykład czytelnego zapisu.
      int b=1_2*10 // da nam 120 bo 12*10=120
      byte b1= (byte) 0b001;
      short s2=(short) 0b0101;
      
    • Uproszczenie składni Map i List
    • Propozycja przewiduje uproszczenie składni dla Map i List przez dodanie możliwości odnoszenia się do nich jak do tablic za pomocą nawiasów kwadratowych.
      final List<Integer> piDigits = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9]; //tworzenie Listy jak tablicy
      final Map<Integer, String> platonicSolids = { 4 : "tetrahedron", 6 : "cube", 8 : "octahedron", 12 : "dodecahedron", 20 : "icosahedron" }; //uproszczone tworzenie mapy
      //uproszczony dostep
      if(piDigits[3]==1){}
      if(platonicSolids[6].compareTo("cube")){}
      
    • Dynamiczna Java, wsparcie dla JSR292
    • Wsparcie w Javie dla dynamicznych typów przez specjalny interfejs java.dyn.Dynamic. Umożliwi łatwiejszą integracje z językami dynamicznymi.
  • Project Lambda - czyli domknięcia ("closures")
  • Tak, tak, tak ;) Więcej o tym: http://blogs.sun.com/mr/entry/closures i http://blogs.sun.com/mr/entry/closures_qa

Uff.. trochę tego jest - a dopiero zbliżam się do połowy zmian w JDK7.
Nie wszystkie te zmiany na pewno wejdą do JDK7, część (dwa ostanie punkty Project Coin i Project Lambda) jeszcze nawet nie są przypisane do odpowiednich Milstonów (choć część rzeczy z Project Coin jest już zaimplementowana, nie wiem jak z domknięciami). Część rzeczy nawet jeżeli już zaimplementowana i wdrożona może jeszcze w czasie testów wylecieć...

Brak komentarzy:

Prześlij komentarz