sobota, 13 września 2008

Co nowego w Java 7 ?

Szperałem sobie ostatnio po internecie w poszukiwaniu informacji o Javie i jej rozwoju natrafiłem na blog Alexa Millera w którym opisał proponowane nowości w Java 7.
Postaram kilka z nich tutaj przybliżyć ale proszę pamiętać, że wszystko jest nieoficjalne i to tylko propozycje !

Wnioskowanie typu
Kompilator będzie wnioskować typ podczas tworzenia obiektów generycznych. Zapis:
Map<String, List<String>> anagrams = new HashMap<String, List<String>>();
może być zastąpiony przez:
Map<String, List<String>> anagrams = new HashMap<>();
Ta zmiana zdecydowanie potrzebna. Wyeliminuje te tasiemce w kodzie:)

String w konstrukcji switch
Tutaj chyba nie trzeba za wiele tłumaczyć. Wprowadzona zostanie możliwość użycia napisu przy wyborze odpowiedniego case'a. Np:
String str = "test";
switch(str) {
case "test":
System.out.println("TEST!");
break;
case "test2":
System.out.println("TEST2");
break;

default:
System.out.println("KLOPS!");
break;
}

Przeciążenie operatora dla BigDecimal
Tutaj trochę dyskusji na blogach jest. Czy w ogóle to wprowadzać, czy wprowadzić tylko dla BigDecimal, czy wprowadzić ogólnie przeciążenie operatora.
Wg mnie wprowadzenie przeciążenia operatora narobi sporo zamieszania. Java jest już bardzo rozwiniętym językiem i wprowadzenie takiego mechanizmu może więcej zaszkodzić niż pomóc. Chyba, że nie dotykać biblioteki standardowej, umożliwić dziedziczenie po wszystkich klasach z niej i niech programiści sami sobie radzą. Co oczywiście, też jest beznadziejnym podejściem do sprawy...
nie wypowiadam się;]

Właściwości dla obiektów JavaBeans
Jak w C# lub VisalBasicu, bezpośredni dostęp do właściwości beanów a nie przez gety lub sety:
public property String name;

Blok automatycznego zarządzania zasobami
To jest dobre! I bardzo proszę o wprowadzenie;] Jest propozycja by wprowadzić blok kodu po wykonaniu którego zasoby w nim użyte będą natychmiastowo usuwane. Coś żeby obejść problem bloku finally (tzn. momentu jego wykonania) a zarazem wprowadzenie możliwości usuwania kilku zasobów razem.
do (BufferedInputStream bis = ...; BufferedOutputStream bos = ...) {  
// ...
} // tutaj zmienne bis i bos zostaną usunięte z pamięci

Wywołania łancuchowe
To jest dość ciekawe. Metody zwracające void będą w niektórych przypadkach zwracać this przez co będą możliwe takie wywołania:
class Micky {
public void scream() { // ... }
public void waveHand() { // ... }
public void talk(String text) { // ... }
}

Micky micky = new Micky();
micky.scream().waveHand().talk("Hello, world!");
Ale szczerze to nie sądze aby to wprowadzono ;-)

Ulepszony blok catch
Nareszcie! Oby to wprowadzono ! Pewnie wielu z Was denerwowały tasiemce bloków catch w stylu:
try {
mbs.registerMBean(mbean, name);
} catch (InstanceAlreadyExistsException e) {
System.err.println(e);
} catch (MBeanRegistrationException e) {
System.err.println(e);
} catch (NotCompliantMBeanException e) {
System.err.println(e);
}
Teraz to będzie mogło być zastąpione taką konstrukcją:
try {
mbs.registerMBean(mbean, name);
} catch (InstanceAlreadyExistsException | 
MBeanRegistrationException |
NotCompliantMBeanException e) {
System.err.println(e);
}
Po prostu rozdzielamy typy wyjątków operatorem | i obsługujemy wszystkie w jednakowy sposób.

Domknięcia
To chyba największy bonus językowy. Jak widać coraz więcej jezyków zaczyna obsługiwać takie konstrukcje. Jeśli chodzi o jakieś szczegółowe informacje to niestety nic nie zostało jeszcze postanowione. Społeczność Javy ciągle spiera się w jakiej postaci mają zostać one wprowadzone. Zaciekawionych tematem zachęcam do przeczytania tego artykułu

To by był taki zarys nowości w jakie mogą się pojawić w Java 7. Osoby bardziej zainteresowane tematem zachęcam do poczytania artykułów do których linki pojawiły się w poście ;-)
Rozwojowe wersje JDK 7 można pobrać ze strony https://jdk7.dev.java.net/.
Blog poświęcony Java 7: java7.tumblr.com/

UPDATE
Napisałem kolejną część przygód Javy 7 z nowymi informacjami co udało się przepchnąć do standardu -> Co nowego w Java 7 ? Część druga.

UPDATE 2
I kolejna część: Co nowego w Java 7 ? Część trzecia - będą domknięcia !

UPDATE 3
I ostatnia: (Prawdopodobnie ostatnie) Podsumowanie nowości w Java 7

7 komentarzy:

  1. jedyne, czego nie wiedziałem, to o voidach zwracających this. Stosuję natomiast wzorzec withXXX(), gdzie prócz seterów dostarczamy metody:

    public MyClass withName(String name) {
    this.name = name;
    return this;
    }

    co umożliwia ich użycie w łańcuchu.

    Racjonalny Developer

    OdpowiedzUsuń
  2. A tego wnioskowania typów nie ma czasem już w Java SE 6?

    OdpowiedzUsuń
  3. u mnie nie ma;P Więc chyba niestety ;-)
    Ten artykuł jest już troszkę nieaktualny i bym musiał napisać nowy, bo np. domknięć nie zobaczymy w nowej Javie ;(

    OdpowiedzUsuń
  4. Co do domknięć to może i dobrze ;-)

    Może stabilność Javy jest ważniejsza od innowacyjności?

    OdpowiedzUsuń
  5. Stabilność nie ma nic do rzeczy w tym wypadku. Domknięcia są dostępne we wszystkich nowoczesnych językach i powód dla których nie ma ich w Javie jest dla mnie jedynie dowodem na to, że twórcy tego języka są niereformowalni.

    OdpowiedzUsuń
  6. No mi strasznie żal tych domknięć ;-/ nie znalazłem w internecie dlaczego zostały odrzucone.

    W każdym razie zapraszam do drugiej części artykułu, które popełniłem wczoraj: http://wookasz.blogspot.com/2009/10/co-nowego-w-java-7-czesc-druga.html

    OdpowiedzUsuń
  7. Jednak będą domknięcia ! :)
    http://wookasz.blogspot.com/2010/02/co-nowego-w-java-7-czesc-trzecia-beda.html

    OdpowiedzUsuń