Java 24 nie działa String Template

Java 24 nie działa String Template
ST
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Witam nie działa mi STR w Javie 24 jak to dodać do kodu? Chciałbym zastosować w tym kodzie wszystkie nowości dostępne w Javie 24, czyli nowy Switch, yield, void main, println() i STR.
https://www.javaalmanac.io/jdk/24/

Kopiuj
import java.util.Scanner;

public class p07 {

    public static void main(String[] args) {
        String newline = System.lineSeparator();
        System.out.println("WZORY MATEMATYCZNE:");
        System.out.println("Wybierz wzór:" + newline + "1) Obwód kwadratu" + newline + "2) Obwód prostokąta" + newline + "3) Pole prostokąta");
        Scanner sc = new Scanner(System.in);
        int option = sc.nextInt();

        String chosenOption = switch (option) {

            case 1, 6 -> {
                System.out.print("Podaj długość boku kwadratu aby wyliczyć jego obwód: ");
                int sideLength = sc.nextInt();
                System.out.println("Obwód kwadratu to: " + (4 * sideLength));
                yield "Wybrałeś opcję: " + option;
            }
            case 2 -> {
                System.out.print("Podaj długość boku A prostokąta: ");
                int sideLengthA = sc.nextInt();
                System.out.print("Podaj długość boku N prostokąta: ");
                int sideLengthB = sc.nextInt();
                System.out.println("Obwód prostokąta: " + (2 * sideLengthA + 2 * sideLengthB));
                yield "Wybrałeś opcję: " + option;
            }
            case 3 -> {
                System.out.print("Podaj długość boku A prostokąta: ");
                int sideLengthAA = sc.nextInt();
                System.out.print("Podaj długość boku N prostokąta: ");
                int sideLengthBB = sc.nextInt();
                System.out.println("Pole prostokąta: " + (sideLengthAA * sideLengthBB));
                yield "Wybrałeś opcję: " + option;
            }
            default -> {
                System.out.println("Brak takiej opcji!!!");
                yield "Brak opcji!";
            }
        };

        System.out.println(chosenOption);
    }

}

MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 114
0
stonhage napisał(a):

Witam nie działa mi STR w Javie 24 jak to dodać do kodu? Chciałbym zastosować w tym kodzie wszystkie nowości dostępne w Javie 24, czyli nowy Switch, yield, void main, println() i STR.
https://www.javaalmanac.io/jdk/24/

Kopiuj
import java.util.Scanner;

public class p07 {

    public static void main(String[] args) {
        String newline = System.lineSeparator();
        System.out.println("WZORY MATEMATYCZNE:");
        System.out.println("Wybierz wzór:" + newline + "1) Obwód kwadratu" + newline + "2) Obwód prostokąta" + newline + "3) Pole prostokąta");
        Scanner sc = new Scanner(System.in);
        int option = sc.nextInt();

        String chosenOption = switch (option) {

            case 1, 6 -> {
                System.out.print("Podaj długość boku kwadratu aby wyliczyć jego obwód: ");
                int sideLength = sc.nextInt();
                System.out.println("Obwód kwadratu to: " + (4 * sideLength));
                yield "Wybrałeś opcję: " + option;
            }
            case 2 -> {
                System.out.print("Podaj długość boku A prostokąta: ");
                int sideLengthA = sc.nextInt();
                System.out.print("Podaj długość boku N prostokąta: ");
                int sideLengthB = sc.nextInt();
                System.out.println("Obwód prostokąta: " + (2 * sideLengthA + 2 * sideLengthB));
                yield "Wybrałeś opcję: " + option;
            }
            case 3 -> {
                System.out.print("Podaj długość boku A prostokąta: ");
                int sideLengthAA = sc.nextInt();
                System.out.print("Podaj długość boku N prostokąta: ");
                int sideLengthBB = sc.nextInt();
                System.out.println("Pole prostokąta: " + (sideLengthAA * sideLengthBB));
                yield "Wybrałeś opcję: " + option;
            }
            default -> {
                System.out.println("Brak takiej opcji!!!");
                yield "Brak opcji!";
            }
        };

        System.out.println(chosenOption);
    }

}

to jest nowość, te switche, w javie 24 a nie 21 LTS ? 🤔

ST
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

To jak dodać? Dokumentacja Javy jest okropna, strona główna Javy żeby coś tam znaleźć jest okropna. To STR jest brzydkie mogli dodać tak jak to jest w JS lub Pythonie. Nie ma z czego uczyć się nowoczesnej Javy, same kursy i książki do Javy 8 i 11. W najnowszych książkach Herberta Schildta ciągle uczą starego Switch. Nie wiem czy nie wybrać innego języka do nauki.

Kopiuj
public class Java24 {

     void main() {
    	String name = "Joan";
        String info = STR."My name is \{name}";
        System.out.println(info);
    }

}
99xmarcin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2420
1

Dokumentacja jest wyśmienita tylko trzeba umieć szukać: https://openjdk.org/jeps/459

To jest second preview.

Pomysł był taki żeby można było wiele formatterów użyć ale żeby z 2 strony nie gryzło się z istniejącą gramatyką języka.

-- Moja opinia --

IMHO było by lepiej jakby użyto składni:

Kopiuj
fmt"foo = ${foo}"

Przy czym fmt musiało by być importem statycznym, czyli można by było własne definiować własne formattery.

Niestety to robi pewne zamieszanie w gramatyce np. łatwo przeoczyć błąd:

Kopiuj
int fmt = 0;
fmt(+)"foo"
ST
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Tak w innych językach jest to lepiej zrobione i przemyślane.

Kopiuj
C#	$"{x} plus {y} equals {x + y}"
Visual Basic	$"{x} plus {y} equals {x + y}"
Python	f"{x} plus {y} equals {x + y}"
Scala	s"$x plus $y equals ${x + y}"
Groovy	"$x plus $y equals ${x + y}"
Kotlin	"$x plus $y equals ${x + y}"
JavaScript	`${x} plus ${y} equals ${x + y}`
Ruby	"#{x} plus #{y} equals #{x + y}"
Swift	"\(x) plus \(y) equals \(x + y)"
Rust    "{1} plus {2} equals {}"
Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
3

https://bugs.openjdk.org/browse/JDK-8329949 Remove the String Templates preview feature

As there's no clear consensus on how to re-design the feature, we have come to the position that it would be more prudent to drop it for the time being. String templates will not be a feature of Java 23, even as a preview feature.

M3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Wszystko działa wystarczy tylko w ide kliknąć alt+enter i wybrać pewną opcję. Ten program poniżej działa na JDK-22.

Kopiuj

import java.util.Scanner;

public class p08 {

    void main() {
        // Ten program działa na Javie 22 trzeba tylko dodać w alt+enter pewną opcję   
        String newline = System.lineSeparator();
        System.out.println("WZORY MATEMATYCZNE:");
        System.out.println(STR."Wybierz wzór: \{newline} 1) Obwód kwadratu \{newline} 2) Obwód prostokąta \{newline} 3) Pole prostokąta");
        Scanner sc = new Scanner(System.in);
        int option = sc.nextInt();

        String chosenOption = switch (option) {

            case 1, 6 -> {
                System.out.print("Podaj długość boku kwadratu aby wyliczyć jego obwód: ");
                int sideLength = sc.nextInt();
                System.out.println(STR."Obwód kwadratu to: \{4 * sideLength}");
                yield STR."Wybrałeś opcję: \{option}";
            }
            case 2 -> {
                System.out.print("Podaj długość boku A prostokąta: ");
                int sideLengthA = sc.nextInt();
                System.out.print("Podaj długość boku N prostokąta: ");
                int sideLengthB = sc.nextInt();
                System.out.println(STR."Obwód prostokąta: \{2 * sideLengthA + 2 * sideLengthB}");
                yield "Wybrałeś opcję: " + option;
            }
            case 3 -> {
                System.out.print("Podaj długość boku A prostokąta: ");
                int sideLengthAA = sc.nextInt();
                System.out.print("Podaj długość boku N prostokąta: ");
                int sideLengthBB = sc.nextInt();
                System.out.println(STR."Pole prostokąta: \{sideLengthAA * sideLengthBB}");
                yield STR."Wybrałeś opcję \{option}";
            }
            default -> {
                System.out.println("Brak takiej opcji!!!");
                yield "Brak opcji!";
            }
        };

        System.out.println(chosenOption);

        /* Test */
        String name = "Joan";
        String info = STR."My name is \{name}";
        System.out.println(info);
    }

}

Ta wersja programu powinna działać na JDK-25

Kopiuj

import java.util.Scanner;

public class p08 {

    void main() {
        // Ten program działa na Javie 22 trzeba tylko dodać w alt+enter pewną opcję   
        String newline = System.lineSeparator();
        println("WZORY MATEMATYCZNE:");
        println(STR."Wybierz wzór: \{newline} 1) Obwód kwadratu \{newline} 2) Obwód prostokąta \{newline} 3) Pole prostokąta");
        Scanner sc = new Scanner(System.in);
        int option = sc.nextInt();

        String chosenOption = switch (option) {

            case 1, 6 -> {
                print("Podaj długość boku kwadratu aby wyliczyć jego obwód: ");
                int sideLength = sc.nextInt();
                println(STR."Obwód kwadratu to: \{4 * sideLength}");
                yield STR."Wybrałeś opcję: \{option}";
            }
            case 2 -> {
                print("Podaj długość boku A prostokąta: ");
                int sideLengthA = sc.nextInt();
                print("Podaj długość boku N prostokąta: ");
                int sideLengthB = sc.nextInt();
                println(STR."Obwód prostokąta: \{2 * sideLengthA + 2 * sideLengthB}");
                yield "Wybrałeś opcję: " + option;
            }
            case 3 -> {
                print("Podaj długość boku A prostokąta: ");
                int sideLengthAA = sc.nextInt();
                print("Podaj długość boku N prostokąta: ");
                int sideLengthBB = sc.nextInt();
                println(STR."Pole prostokąta: \{sideLengthAA * sideLengthBB}");
                yield STR."Wybrałeś opcję \{option}";
            }
            default -> {
                println("Brak takiej opcji!!!");
                yield "Brak opcji!";
            }
        };

        println(chosenOption);

        /* Test */
        String name = "Joan";
        String info = STR."My name is \{name}";
        println(info);
    }

}

Olamagato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Polska, Warszawa
  • Postów: 1066
0
stonhage napisał(a):

To jak dodać? Dokumentacja Javy jest okropna, strona główna Javy żeby coś tam znaleźć jest okropna. To STR jest brzydkie mogli dodać tak jak to jest w JS lub Pythonie. Nie ma z czego uczyć się nowoczesnej Javy, same kursy i książki do Javy 8 i 11. W najnowszych książkach Herberta Schildta ciągle uczą starego Switch. Nie wiem czy nie wybrać innego języka do nauki.

Stary switch nie zniknął i nie zniknie bo nie ma czym go zastąpić. Nie bez powodu switch z kaskadą przenoszony był bez żadnych zmian od czasów języka C, aż do najnowszych, które mają podobną składnię. Bo na przykład bez starego switcha nie da się prosto i czytelnie zrobić obsługi sterowania w grafice. Kaskady bez break są wciąż potrzebne, żeby nie powtarzać kodu. Nowe użycia z lambdami i jako wyrażenie to coś czego można się nauczyć w ciągu kilku minut prosto z dokumentacji lub wielu innych stron. Podobnie jak z wielowierszowymi ciągami znaków oraz formatterami znaków. To zbyt małe uzupełnienia w języku, żeby trzeba było zmieniać podręczniki lub nawet drukować nowe edycje.
Na przykład moim zdaniem obecna moda na Pythona skończy się gdy tylko facetom w końcu znudzi się rozbieranie swoich koleżanek i ciotek na zdjęciach z facebooka przy użyciu AI, albo bo w innych językach prędzej czy później będą te same lub większe możliwości. A będą - przynajmniej jako porty do bibliotek dostępnych w Pythonie.

Tobie potrzeba po prostu porządnego podręcznika. Weź sobie choćby z biblioteki wojewódzkiej (bo muszą mieć), albo kup w księgarni trzecią edycję "Java Efektywne Programowanie" od Joshua Blocha, gdzie masz Javę 10/11 i to właściwie wystarczy bo i tak będziesz ją mielił kartka po kartce prawie przez rok (lub dłużej). Przy okazji nauczysz się technik, które w Javie są już przestarzałe i wypadają jako niezalecane (w tym np. nieograniczone dziedziczenie po klasach konkretnych) oraz tych do których Java nie jest jeszcze w pełni dostosowana i wkrótce będą pojawiać się nowe elementy języka lub bibliotek standardowych, co można wykukać dobrze się wczytując w tekst i przykłady.

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0
Olamagato napisał(a):

Stary switch nie zniknął i nie zniknie bo nie ma czym go zastąpić. Nie bez powodu switch z kaskadą przenoszony był bez żadnych zmian od czasów języka C, aż do najnowszych, które mają podobną składnię. Bo na przykład bez starego switcha nie da się prosto i czytelnie zrobić obsługi sterowania w grafice. Kaskady bez break są wciąż potrzebne, żeby nie powtarzać kodu.

z rusta raczej stary switch wyleciał: https://doc.rust-lang.org/rust-by-example/flow_control/match.html - są tylko match expressions (switch vs match to tylko kwestia doboru słów kluczowych, ale w tym przypadku semantyka jest właśnie zdecydowanie inna). biorąc pod uwagę to, że dla rusta jest więcej silników graficznych niż gier, to chyba brak switcha z c nie przeszkadza, żeby sklecić sobie silnik graficzny w ruście.

java natomiast umożliwia mieszanie switch statements i switch expressions, o ile dobrze rozumiem to: https://dev.java/learn/language-basics/switch-expression/ (daaaaaaaaaaaaawno nie programowałem na poważnie w javie, więc nawet nie przetestowałem tego w boju).

w obu językach, do uniknięcia duplikacji kodu przy użyciu match / switch expressions, grupuje się przypadki, czyli np zamiast:

Kopiuj
case a:
case b:
case c:
  xxx();
  yyy();
  zzz();
  break;
case d:
case e:
case f:
  abc();
  def();
  ghi();
  break;

stosuje się:

Kopiuj
case a, b, c -> {
  xxx();
  yyy();
  zzz();
}
case d, e, f -> {
  abc();
  def();
  ghi();
}

i wychodzi nawet czytelniej.

Olamagato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Polska, Warszawa
  • Postów: 1066
0
Wibowit napisał(a):

z rusta raczej stary switch wyleciał: https://doc.rust-lang.org/rust-by-example/flow_control/match.html - są tylko match expressions (switch vs match to tylko kwestia doboru słów kluczowych, ale w tym przypadku semantyka jest właśnie zdecydowanie inna). biorąc pod uwagę to, że dla rusta jest więcej silników graficznych niż gier, to chyba brak switcha z c nie przeszkadza, żeby sklecić sobie silnik graficzny w ruście.

Cóż - skoro tak, to pewnie aż tak nie przeszkadza. Rusta jeszcze nie znam, więc sobie doczytam tak czy inaczej.

w obu językach, do uniknięcia duplikacji kodu przy użyciu match / switch expressions, grupuje się przypadki, czyli np zamiast:
[...]
i wychodzi nawet czytelniej.

Nie o ten przypadek mi chodziło bo ten który podałeś nie jest kaskadą. Chodziło mi o takie przypadki jak ten:

Kopiuj
switch(config)
{
case NONONO:
    xxx();
    break;
case NO_RATIO:
	abc(); //kaskada do BOX
case BOX:
	cde();
	fgh(); //kaskada do LETTER
case LETTER:
    ijk(); //kaskada do default
default:
	lmn();
}

Jak widać tutaj grupowanie niewiele da bo nie jest to ten przypadek. Trzeba powielić wywołania jeżeli każdy przypadek ma być obsłużony bez kaskady. A wtedy łatwo się pomylić np. przy modyfikowaniu wywołania abc() - bo trzeba będzie poprawiać identycznie w trzech miejscach, a fgh() przynajmniej w dwóch. Z kaskadą oczywiście tylko w jednym, więc można się rąbnąć tylko merytorycznie. A przecież bywają jeszcze bardziej rozbudowane przypadki kaskad (chociaż rzadkie).
Nie wiem jak to napisać lepiej i równie czytelnie bez kaskady.

A tak wracając do tematu, to myślę, że dobrze, że ten preview wywalono. Robi to samo co String::format lub inne dynamiczne generatory stringów, a tylko zaciemnia bo wtedy kodu trzeba szukać również w łańcuchach tekstowych (który może sobie leżeć chwg), a nie w kodzie indeksowanym przez IDE. Robienie na siłę z Javy frontendu do weba nie jest chyba najlepszym pomysłem w taki sposób.

CI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

W nowoczesnej Javie nie trzeba już używać klasy przed funkcją void main(). Działa to na Intellij i w NetBeans, nie wiem czy w Eclipse.

Kopiuj
import java.util.Scanner;

void main() {
    // Ten program działa na Javie 22 trzeba tylko dodać w alt+enter w NetBeans pewną opcję. W Intellij jest więcej zabawy
    // trzeba wybrać w Project Structure to 22 Preview i wyłączyć komunikaty podkreślenia na żółto przy STR.
    String newline = System.lineSeparator();
    System.out.println("WZORY MATEMATYCZNE:");
    System.out.println(STR."Wybierz wzór: \{newline} 1) Obwód kwadratu \{newline} 2) Obwód prostokąta \{newline} 3) Pole prostokąta");
    Scanner sc = new Scanner(System.in);
    int option = sc.nextInt();

    String chosenOption = switch (option) {

        case 1, 6 -> {
            System.out.print("Podaj długość boku kwadratu aby wyliczyć jego obwód: ");
            int sideLength = sc.nextInt();
            System.out.println(STR."Obwód kwadratu to: \{4 * sideLength}");
            yield STR."Wybrałeś opcję: \{option}";
        }
        case 2 -> {
            System.out.print("Podaj długość boku A prostokąta: ");
            int sideLengthA = sc.nextInt();
            System.out.print("Podaj długość boku N prostokąta: ");
            int sideLengthB = sc.nextInt();
            System.out.println(STR."Obwód prostokąta: \{2 * sideLengthA + 2 * sideLengthB}");
            yield "Wybrałeś opcję: " + option;
        }
        case 3 -> {
            System.out.print("Podaj długość boku A prostokąta: ");
            int sideLengthAA = sc.nextInt();
            System.out.print("Podaj długość boku N prostokąta: ");
            int sideLengthBB = sc.nextInt();
            System.out.println(STR."Pole prostokąta: \{sideLengthAA * sideLengthBB}");
            yield STR."Wybrałeś opcję \{option}";
        }
        default -> {
            System.out.println("Brak takiej opcji!!!");
            yield "Brak opcji!";
        }
    };

    System.out.println(chosenOption);

    /* Test */
    String name = "Joan";
    String info = STR."My name is \{name}";
    System.out.println(info);
}

Ktoś może wie jak wyłączyć ten dzwonek Notifications w prawym górnym rogu Intellij? Odchaczyłem Diplay balloon notifications ale to nie działa. Nie chcę co chwilę czyścić Clear all.

aolo23
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 186

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.