fbpx

Szkolenie „Kompletna aplikacja w języku Java” wystartowało!

Oto jest! Mój pierwszy kurs płatny na mojej platformie 🙂

Szkolenie „Kompletna aplikacja w języku Java – od zera do installera” zostało rozpoczęte. Zapisywać się można na https://java.clockworkjava.pl.

  • Jeden program rozwijany krok po kroku przez 22 godziny materiału
  • Architektura aplikacji
  • Najlepsze praktyki i testy jednostkowe
  • Integracja z bazą danych
  • Graficzny interfejs użytkownika

Wszystko to w kontekście jednej, dużej aplikacji. Szczegółowa agenda programu na https://java.clockworkjava.pl/#course-index. Zapisy zamykam 23.X.2020.

Java 15 – Text Block

W Javie 15 dotarł do nas feature o nazwie Text Block, choć w fazie preview był już od bodaj wersji 13.

Mam dla niego nawet doskonały, praktyczny przykład wprost z mojego kursu Kompletna aplikacja w języku Java – od zera do installera ;). Do tej pory, gdy chcieliśmy sformatować wizualnie np. zapytanie do bazy danych

ResultSet resultSet = statement
                    .executeQuery("SELECT R.ID, R.ROOM_NUMBER, B.BED FROM ROOMS AS R LEFT JOIN BEDS AS B ON R.ID=B.ROOM_ID");

Kończyliśmy z czyś takim

Statement statement = SystemUtils.connection.createStatement();
ResultSet resultSet = statement.executeQuery("" +
                            "SELECT " +
                                "R.ID, " +
                                "R.ROOM_NUMBER," +
                                "B.BED " +
                            "FROM " +
                                "ROOMS AS R " +
                            "LEFT JOIN " +
                                "BEDS AS B " +
                            "ON" +
                                " R.ID=B.ROOM_ID");

Używając „bloku tekstu” możemy zapisać to w o wiele przyjemniejszy dla oka sposób:

Statement statement = SystemUtils.connection.createStatement();
ResultSet resultSet = statement.executeQuery("""
                            SELECT 
                              R.ID,
                              R.ROOM_NUMBER,
                              B.BED 
                           FROM
                              ROOMS AS R
                           LEFT JOIN 
                              BEDS AS B 
                           ON
                              R.ID=B.ROOM_ID
                            """);

Odpada nam więc ciągłe otwieranie ” i używanie plusów do łączenia. Blok tekstu zaczynamy i kończymy potrójnym cudzysłowiem """

Dodatkowo wewnątrz bloku możemy do woli korzystać z bez konieczności ciągłego używania \” np.

"""
 Przykład "użycia"
"""

Text block jest traktowany jak zwyczajny String, więc możemy spokojnie zastosowań String.format bądź .replace, by wstrzyknąć tam dane.

int id = 2;

String query  ="""
                    SELECT 
                       ID,
                       ROOM_NUMBER
                    FROM 
                       ROOM
                    WHERE
                       ID = %d 
""";

String finalQuery = String.format(query, id);

Dodano nawet specjalną funkcję do klasy String, by ułatwić powyższe

            int id = 2;

            String finalQuery  ="""
                    SELECT 
                       ID,
                       ROOM_NUMBER
                    FROM 
                       ROOM
                    WHERE
                       ID = %d 
                    """.formatted(id);

By być na bieżąco i mieć realny wpływ na tematykę tworzonych przeze mnie artykułów zapraszam do dołączenia do mojego newslettera.

Java 14 – Więcej informacji przy NullPointerException

Java w wersji 14 daje możliwość uruchomienia rozszerzonych informacji o znanym i lubianym NullPointerException.

Standardowo, gdy odpalimy taki kawałek kodu:

    public static void main(String[] args) {
        howLong(null);
    }
    
    private static int howLong(String s) {
        return s.length();
    }

Dostaniemy taki oto wyjątek:

Exception in thread "main" java.lang.NullPointerException
	at NPEEx.howLong(NPEEx.java:12)
	at NPEEx.main(NPEEx.java:5)

Natomiast, gdy uruchomimy naszą aplikację z dodatkowym argumentem dla Virtual Machine

-XX:+ShowCodeDetailsInExceptionMessages

Dostaniemy już nieco więcej informacji

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "s" is null
	at NPEEx.howLong(NPEEx.java:8)
	at NPEEx.main(NPEEx.java:4)

I o ile w powyższym, prymitywnym przykładzie to nie potrzebujemy pomocy to, gdy mamy do czynienia z typowym anty-patternem „train wreck”:

person.getContactInfo().getAddress().getStreet()

To już dobrze wiedzieć co konkretnie się popsuło. Wówczas dostaniemy taką informację:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Address.getStreet()" because the return value of "ContactInfo.getAddress()" is null
	at NPEEx.main(NPEEx.java:5)

W IntelliJ możemy dodać argument do wirtualnej maszyny w menu Run -> Edit Configurations -> VM Options.

By być na bieżąco i mieć realny wpływ na tematykę tworzonych przeze mnie artykułów zapraszam do dołączenia do mojego newslettera.

Pragmatyczny plan nauki dla ekosystemu Java – v3.0

Jakiś czas temu zapytałem na swojej mailiście o pytania, do nagrania godzinnego i technicznego Q&A z ekosystemu Javy. Jedno spośród pytań było nietechniczne, ale na tyle ciekawe, że postanowiłem przysiąść nad nim poza konkursem. Dodatkowo na tyle popularne, że stwierdziłem, żeby od razu stworzyć wpis na blogu na ten temat.

Chodziło o pokazanie jasnej roadmapy, planu nauki, jak i czego w roku 2021 uczyć się „na juniora”.

No to zaczynamy (i od razu – planuję rozbudowę tego wpisu, ale do tego potrzebuję Twojego feedbacku – po przeczytaniu daj znać na pawel@clockworkjava.pl)

Nagrania z mentoringu Java – droga do Juniora idą właśnie tą ścieżką.

Poziom ZERO

Czytaj dalej Pragmatyczny plan nauki dla ekosystemu Java – v3.0

Java 14 – ulepszona instrukcja switch

W Javie 14 ulepszono nieco składnie dla instrukcji warunkowej switch. Do tej pory przykładowa instrukcja wyglądała tak:

        String command = "add";
        String result = "";

        switch(command) {
            case "add":
                result = "ok";
                break;
            case "remove":
            case "update":
                result = "not ok";
                break;
            default:
                result = "meh";
                break;
        }

Dzięki użyciu nowej składni możemy powyższe zamienić na coś o wiele przyjemniejszego dla oka:

String command = "add";
String result = "";

switch(command) {
    case "add" -> result = "ok";
    case "remove", "update" -> result = "not ok";
    default -> result = "meh";
}

System.out.println(result);

Przede wszystkim pozbywamy się nieszczęsnego break, o którym to każdemu programiście zdarzyło się co najmniej raz w karierze zapomnieć. Dodatkowo wszystkie wartości jakie mają mieć taką samą obsługę wrzucam do jednego case’a, a nie tworzymy jeden pod drugim, co też jest generalnie czytelniejsze.

Ale to nie wszystko! Możemy też używać teraz switcha jako swoistej funkcji, mianowicie taki kod zadziała:

String command = "add";
String result = switch(command) {
    case "add" -> "ok";
    case "remove", "update" -> "not ok";
    default -> "meh";
};

System.out.println(result);

Możemy ominąć niepotrzebne przypisywanie, tylko użyć switch jako funkcji, z tą różnicą, że nawet nie musimy używać return (podobnie jak w lambdach jednolinijkowych).

By być na bieżąco i mieć realny wpływ na tematykę tworzonych przeze mnie artykułów zapraszam do dołączenia do mojego newslettera.

Czym jest transakcja w programowaniu?

Zaczniemy od zdefiniowania czym są transakcje i standardowego przykładu z bankomatem. Najprościej rzecz ujmując transakcja to zestaw kroków danego algorytmu, który musi być wykonany w całości lub, jeśli wystąpi błąd w którymkolwiek z kroków, każda operacja musi zostać „cofnięta”, a stan systemu zostanie przywrócony do momentu sprzed rozpoczęcia pierwszego kroku w transakcji. Zacznijmy od oklepanego przykładu konta bankowego i wypłaty środków z bankomatu.

Czytaj dalej Czym jest transakcja w programowaniu?