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

Tradycyjnie zapraszam do dołączenia do mojego newslettera, gdzie raz w tygodniu dostarczam artykuł dotyczący programowania w ekosystemie Java, są to treści dedykowane dla uczestników newslettera, nie kopia z bloga.

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.

Tradycyjnie zapraszam do dołączenia do mojego newslettera, gdzie raz w tygodniu dostarczam artykuł dotyczący programowania w ekosystemie Java, są to treści dedykowane dla uczestników newslettera, nie kopia z bloga.

Pragmatyczny plan nauki dla ekosystemu Java – v1.1

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 2020 się uczyć “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)

Poziom ZERO

Czytaj dalej Pragmatyczny plan nauki dla ekosystemu Java – v1.1

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

To tyle w temacie nowego switcha 🙂 Zapraszam do dołączenia do dołączenia do newslettera. Tam co tydzień pojawiam się z tekstem natury ogólnoprogramistycznej albo związanej konkretnie z ekosystemem Java. Dołącz, zapraszam 🙂

Uczenie się – najważniejsza umiejętność dla programistów

Poza językiem angielskim jest jeszcze jedna ważna umiejętność dla każdego w branży IT, a mianowicie wiedzieć JAK się uczyć. Nieważne czy dopiero starasz się o pierwszą pracę, jesteś już juniorem, czy masz już dwucyfrowy staż pracy w branży. Na każdym z tych etapów uczyć się trzeba, jeśli pewnego dnia nie chcę się obudzić w bardzo niefajnej sytuacji. Zwłaszcza w obecnej rzeczywistości, a coś o tym wiem, bo moja etatowa firma żyję ze sprzedaży biletów lotniczych i rezerwacji hotelowych. Tough luck.

Mnie nigdzie nie nauczono jak się uczyć. Wiadomo – stare, sprawdzone, przekazywane z pokolenia na pokolenie “nie uczyć się na dzień przed egzaminem”, “wyśpij się” etc. etc. Oczywiście to wszystko prawda, problem był taki, że ja muszę wiedzieć DLACZEGO, prawdy objawione jakoś specjalnie nigdy na mnie nie działały.

O tym dlaczego proces nauki powinno się rozciągać w czasie i dziennie poświęcać jej godzinę, dwie. Nie więcej. O tym dlaczego sen jest ważny w kontekście uczenia się i o wielu, wielu rzeczach można dowiedzieć się ze świetnego, darmowego (!) kursu – Learning How to Learn – https://www.coursera.org/learn/learning-how-to-learn.

Polecam z całego serca.