Java 11 – kilka nowych ficzerów

Java 11 - LTS

Na wstępie chciałem tylko powiedzieć że nowa Java jest LTS(Long Term Support) tak jak poprzednio Java 8. Co to znaczy? Głównie dla użytkowników SE, będzie dostępne komercyjne wsparcie ze strony Oracle, dla użytkowników OpenJDK nie oznacza to właściwie nic, przynajmniej ja to tak rozumiem. W sieci można znaleźć kilka dyskusji na ten temat - niestety żadna z tych które przeczytałem niewiele więcej mówiła. Będą łatki bezpieczeństwa, które i tak zapewne przygotuje community.

Porządki

W nowej wersji usunięto moduły JEE i CORBA które zostały oznaczone jako deprecated w java9 - w której wprowadzono modułowość. Osobiście nigdy nie korzystałem i w zasadzie to szokujące jak wiele tego typu  rzeczy mamy pod ręką, a kurzą się nieużywane. Myślę że to świetny pomysł niepotrzebne - powyrzucać, a jak ktoś będzie bardzo mocno chciał, niech sobie dociągnie jakąś biblioteczkę. RMI użyłem tylko raz na studiach jako ciekawostkę, niestety profesorowie niedługo będą musieli odświeżyć instrukcje laboratoryjne... Oprócz tego dodano kilka usprawnień zarządzania pamięcią.  

Stringi ^^

Wprowadzono też kolejne usprawnienia dotyczące najczęściej spotykanej formy danych - Stringów. Tekst jest bardzo ważny, bo obok liczb wykonujemy na nim najwięcej operacji w naszych aplikacjach i po compact strings z javy9 przyszła pora na dodanie kilku przydatnych metod w API. Ile razy usuwaliśmy ręcznie białe znaki z początku linii? Ile razy musieliśmy sprawdzać czy tekst jest pusty, bądź używać brzydkich statycznych metod z Apache Commons?   Niech prawdę powiedzą nam testy:  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@Test
public void repeat_should_repeat_string(){
    var result = "test,".repeat(2);
    assertThat(result).isEqualTo("test,test,");
}

@Test
public void no_repeat_should_return_empty_string(){
    var result = "test,".repeat(0);
    assertThat(result).isEqualTo("");
}

@Test
public void string_has_lines_method_already_yuppi(){
    var result = "test,\n".repeat(40).lines().collect(Collectors.toList());
    assertThat(result).allMatch(line->line.equals("test,"));
    assertThat(result.size()).isEqualTo(40);
}

@Test
public void this_string_is_not_blank(){
    assertThat("test,\n".isBlank()).isFalse();
}

@Test
public void but_this_one_is_blank(){
    assertThat("\t      \t\n   \t".isBlank()).isTrue();
}

@Test
public void strip_vs_trim_hmm(){
    //unicode <= U+0020
    assertThat(" aa ".trim()).isEqualTo("aa");

    //wykonuje metodę isWhitespace() - performance?
    assertThat(" aa ".strip()).isEqualTo("aa");
}

@Test
public void strip_additional_features(){
    assertThat(" aa ".stripTrailing()).isEqualTo(" aa");
    assertThat(" aa ".stripLeading()).isEqualTo("aa ");
}

@Test
public void and_still_missing_feature_for_me() {
    var ex = catchThrowable(()->String.class.getDeclaredField("EMPTY"));
    assertThat(ex)
            .isNotNull()
            .isInstanceOf(NoSuchFieldException.class);
}
  Jak widać przybyło kilka ciekawych narzędzi. Osobiście lines() wygląda jak coś czego można często używać, podobnie stripLeading() i stripTrailing() 🙂 Ale cały czas brakuje mi stałej na pusty string, do której tak bardzo przyzwyczaiłem się w C#.  

Podsumowanie

W kontekście nowego API które ma wejść w życie niewiele dodano. Za to usunięto kilka niepotrzebnych modułów co niektórym może nie być na rękę, ale z drugiej strony sprawia że paczki są mniejsze, no i usprawniono między innymi GC, co zapewne wymagało wkładu pracy - nie jestem w tym temacie wystarczająco obeznany i ciężko się wypowiedzieć. W każdym razie nie wiem jakie są wasze doświadczenia, ale myślę wiele osób pozostało gdzieś przy javie 8. Nowa 11 jako LTS może skusi te osoby do migracji i używania spektrum nowych funkcjonalności z 9 i 10 - jak chociażby kaczotypowanie czy reactive streams. Jeszcze 3 dni i nowa JAVA wchodzi oficjalnie w światła reflektorów! Licznik kończy odliczanie 😉
Close Menu