ืฉื—ืจื•ืจ ืฉืœ ืคืœื˜ืคื•ืจืžืช Java SE 22 ื•ื™ื™ืฉื•ื ื”ืคื ื™ื” ืคืชื•ื—ื” ืฉืœ OpenJDK 22

ืœืื—ืจ ืฉื™ืฉื” ื—ื•ื“ืฉื™ื ืฉืœ ืคื™ืชื•ื—, ืื•ืจืงืœ ืฉื—ืจืจื” ืืช ืคืœื˜ืคื•ืจืžืช Java SE 22 (Java Platform, Standard Edition 22), ื”ืžืฉืชืžืฉืช ื‘ืคืจื•ื™ืงื˜ ื”ืงื•ื“ ื”ืคืชื•ื— OpenJDK ื›ื™ื™ืฉื•ื ื™ื™ื—ื•ืก. ืœืžืขื˜ ื”ืกืจืช ื—ืœืง ืžื”ืชื›ื•ื ื•ืช ืฉื”ื•ืฆืื• ืžืฉื™ืžื•ืฉ, Java SE 22 ืฉื•ืžืจ ืขืœ ืชืื™ืžื•ืช ืœืื—ื•ืจ ืขื ืžื”ื“ื•ืจื•ืช ืงื•ื“ืžื•ืช ืฉืœ ืคืœื˜ืคื•ืจืžืช Java - ืจื•ื‘ ืคืจื•ื™ืงื˜ื™ ื”-Java ืฉื ื›ืชื‘ื• ื‘ืขื‘ืจ ืขื“ื™ื™ืŸ ื™ืคืขืœื• ืœืœื ืฉื™ื ื•ื™ ื›ืืฉืจ ื”ื ืคื•ืขืœื™ื ืชื—ืช ื”ื’ืจืกื” ื”ื—ื“ืฉื”. ื‘ื ื™ื™ื” ื ื™ืชื ืช ืœื”ืชืงื ื” ืฉืœ Java SE 22 (JDK, JRE ื•ืฉืจืช JRE) ืžื•ื›ื ื•ืช ืขื‘ื•ืจ Linux (x86_64, AArch64), Windows (x86_64) ื•-macOS (x86_64, AArch64). ืžื™ืžื•ืฉ ื”ื”ืชื™ื™ื—ืกื•ืช ืฉืœ Java 22, ืฉืคื•ืชื— ืขืœ ื™ื“ื™ ืคืจื•ื™ืงื˜ OpenJDK, ืคืชื•ื— ื‘ืžืœื•ืื• ืชื—ืช ืจื™ืฉื™ื•ืŸ GPLv2 ืขื ื—ืจื™ื’ื™ื ืฉืœ GNU ClassPath ื›ื“ื™ ืœืืคืฉืจ ืงื™ืฉื•ืจ ื“ื™ื ืžื™ ืœืžื•ืฆืจื™ื ืžืกื—ืจื™ื™ื.

Java SE 22 ืžืกื•ื•ื’ ื›ื’ืจืกืช ืชืžื™ื›ื” ืจื’ื™ืœื” ื•ืชืžืฉื™ืš ืœืงื‘ืœ ืขื“ื›ื•ื ื™ื ืขื“ ื”ืžื”ื“ื•ืจื” ื”ื‘ืื”. ืขื ืฃ ื”ืชืžื™ื›ื” ืœื˜ื•ื•ื— ืืจื•ืš (LTS) ืฆืจื™ืš ืœื”ื™ื•ืช Java SE 21 ืื• Java SE 17, ืืฉืจ ื™ืงื‘ืœื• ืขื“ื›ื•ื ื™ื ืขื“ 2031 ื•-2029, ื‘ื”ืชืืžื” (ื–ืžื™ืŸ ื‘ื“ืจืš ื›ืœืœ ืขื“ 2028 ื•-2026). ื”ืชืžื™ื›ื” ื”ืฆื™ื‘ื•ืจื™ืช ื‘ืกื ื™ืฃ LTS ืฉืœ Java SE 11 ื”ืกืชื™ื™ืžื” ื‘ืกืคื˜ืžื‘ืจ ื”ืื—ืจื•ืŸ, ืืš ื”ืชืžื™ื›ื” ื”ืžื•ืจื—ื‘ืช ืชื™ืžืฉืš ืขื“ 2032. ืชืžื™ื›ื” ืžื•ืจื—ื‘ืช ื‘ืกื ื™ืฃ LTS ืฉืœ Java SE 8 ืชื™ืžืฉืš ืขื“ 2030.

ื ื–ื›ื™ืจ ืœื›ื ืฉื”ื—ืœ ืžื”ืฉื—ืจื•ืจ ืฉืœ Java 10, ื”ืคืจื•ื™ืงื˜ ืขื‘ืจ ืœืชื”ืœื™ืš ืคื™ืชื•ื— ื—ื“ืฉ, ืžื” ืฉืžืจืžื– ืขืœ ืžื—ื–ื•ืจ ืงืฆืจ ื™ื•ืชืจ ืœื”ื™ื•ื•ืฆืจื•ืช ืžื”ื“ื•ืจื•ืช ื—ื“ืฉื•ืช. ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื—ื“ืฉื” ืžืคื•ืชื—ืช ื›ืขืช ื‘ืกื ื™ืฃ ืžืืกื˜ืจ ืื—ื“ ื”ืžืชืขื“ื›ืŸ ื›ืœ ื”ื–ืžืŸ, ื”ื›ื•ืœืœ ืฉื™ื ื•ื™ื™ื ืžื•ื›ื ื™ื ื•ืžืžื ื• ืžืกืชืขืคื™ื ืกื ื™ืคื™ื ื›ืœ ื—ืฆื™ ืฉื ื” ื›ื“ื™ ืœื™ื™ืฆื‘ ืžื”ื“ื•ืจื•ืช ื—ื“ืฉื•ืช.

ืชื›ื•ื ื•ืช ื—ื“ืฉื•ืช ื‘-Java 22 ื›ื•ืœืœื•ืช:

  • ืื•ืกืฃ ื”ืืฉืคื” G1 ื›ื•ืœืœ ืชืžื™ื›ื” ื‘ื”ืฆืžื“ืช ืื–ื•ืจื™ื, ื”ืžืืคืฉืจืช ืœืชืงืŸ ื‘ืื•ืคืŸ ื–ืžื ื™ ืืช ืžื™ืงื•ืžื ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ Java ื‘ื–ื™ื›ืจื•ืŸ ื›ื“ื™ ืœืžื ื•ืข ืืช ื”ื–ื–ืชื ืขืœ ื™ื“ื™ ืืกืคืŸ ื”ืืฉืคื” ื•ืœืืคืฉืจ ื”ืขื‘ืจื” ื‘ื˜ื•ื—ื” ืฉืœ ื”ืคื ื™ื•ืช ืœืื•ื‘ื™ื™ืงื˜ื™ื ืืœื• ื‘ื™ืŸ Java ืœืงื•ื“ ืžืงื•ืจื™. ื”ื”ืฆืžื“ื” ืžืืคืฉืจืช ืœืš ืœื”ืคื—ื™ืช ืืช ื–ืžืŸ ื”ื”ืฉื”ื™ื” ื•ืœื”ื™ืžื ืข ืžื”ืฉื‘ืชืช ืื™ืกื•ืฃ ื”ืืฉืคื” ื‘ืขืช ื‘ื™ืฆื•ืข ืื–ื•ืจื™ื ืงืจื™ื˜ื™ื™ื ืฉืœ JNI (Java Native Interface) ืขื ืงื•ื“ ืžืงื•ืจื™ (ื‘ื–ืžืŸ ื‘ื™ืฆื•ืข ืงื˜ืขื™ื ืืœื”, ื”-JVM ืœื ืืžื•ืจ ืœื”ื–ื™ื– ืื•ื‘ื™ื™ืงื˜ื™ื ืงืจื™ื˜ื™ื™ื ื”ืžืฉื•ื™ื›ื™ื ืืœื™ื”ื ื›ื“ื™ ืœื”ื™ืžื ืข ืžืชื ืื™ ืžืจื•ืฅ). ื”ืฆืžื“ื” ืžืกื™ืจื” ืื•ื‘ื™ื™ืงื˜ื™ื ืงืจื™ื˜ื™ื™ื ืžืขื™ื ื™ ืื•ืกืฃ ื”ืืฉืคื”, ืฉื™ื›ื•ืœ ืœื”ืžืฉื™ืš ืœื ืงื•ืช ืื–ื•ืจื™ื ืœื ืžื•ืฆืžื“ื™ื.
  • ื ื•ืกืคื” ืชื›ื•ื ื” ืจืืฉื•ื ื™ืช ื›ื“ื™ ืœืืคืฉืจ ืœืฆื™ื™ืŸ ื‘ื™ื˜ื•ื™ื™ื ื‘ื‘ื•ื ื™ื ืœืคื ื™ ืงืจื™ืื” ืœืกื•ืคืจ(...), ื”ืžืฉืžืฉืช ืœืงืจื™ืื” ืžืคื•ืจืฉืช ืœื‘ื ืื™ ืžื—ืœืงื•ืช ืื‘ ืžื‘ื ืื™ ืžื—ืœืงื” ืฉืขื‘ืจ ื‘ื™ืจื•ืฉื” ืื ื‘ื™ื˜ื•ื™ื™ื ืืœื” ืื™ื ื ืžืชื™ื™ื—ืกื™ื ืœืžื•ืคืข ืฉื ื•ืฆืจ ืขืœ ื™ื“ื™ ื”ื‘ื ืื™. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); ืกื•ึผืคึผึถืจ(); } } }
  • ื”-API ืฉืœ FFM (Foreign Function & Memory) ื™ื•ืฆื‘, ื•ืžืืคืฉืจ ืื™ื ื˜ืจืืงืฆื™ื” ืฉืœ ืชื•ื›ื ื™ื•ืช Java ืขื ืงื•ื“ ื•ื ืชื•ื ื™ื ื—ื™ืฆื•ื ื™ื™ื ืขืœ ื™ื“ื™ ืงืจื™ืื” ืœืคื•ื ืงืฆื™ื•ืช ืžืกืคืจื™ื•ืช ื—ื™ืฆื•ื ื™ื•ืช ื•ื’ื™ืฉื” ืœื–ื™ื›ืจื•ืŸ ืžื—ื•ืฅ ืœ-JVM, ืžื‘ืœื™ ืœื”ื–ื“ืงืง ืœืฉื™ืžื•ืฉ ื‘-JNI (Java Native Interface).
  • ืชืžื™ื›ื” ื‘ืžืฉืชื ื™ื ืœืœื ืฉื ื•ื”ืชืืžืช ื“ืคื•ืกื™ื ื”ื•ืคืขืœื” - ื‘ืžืงื•ื ืžืฉืชื ื™ื ื•ื“ืคื•ืกื™ื ืฉืื™ื ื ื‘ืฉื™ืžื•ืฉ ืืš ื”ื›ืจื—ื™ื™ื ื‘ืขืช ืงืจื™ืื”, ื›ืขืช ืชื•ื›ืœ ืœืฆื™ื™ืŸ ืืช ื”ืชื• "_". // was String pageName = switch (page) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> "ISSUE #" + issueNumber; ... }; // ืขื›ืฉื™ื• ืืชื” ื™ื›ื•ืœ String pageName = switch (page) { case GitHubIssuePage(_, _, _, int issueNumber) -> "ISSUE #" + issueNumber; };
  • ื™ื™ืฉื•ื ืจืืฉื•ื ื™ ืฉืœ ื”-Class-File API ืžื•ืฆืข ืœื ื™ืชื•ื—, ื™ืฆื™ืจื” ื•ื”ืžืจื” ืฉืœ ืงื‘ืฆื™ ืžื—ืœืงื•ืช Java. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue(). startsWith("debug"))) { classBuilder.with(ce); } } });
  • ืชื•ื›ื ื™ืช ื”ืฉื™ืจื•ืช Java ืžืกืคืงืช ืืช ื”ื™ื›ื•ืœืช ืœื”ืจื™ืฅ ืชื•ื›ื ื™ื•ืช Java, ื”ืžืกื•ืคืงื•ืช ื‘ืฆื•ืจื” ืฉืœ ืžืกืคืจ ืงื•ื‘ืฆื™ ืงื•ื“ ืื• ืกืคืจื™ื•ืช ืžื—ืœืงื•ืช ื”ื™ื“ื•ืจ ืžืจืืฉ, ืœืœื ืงื•ืžืคื™ืœืฆื™ื” ื ืคืจื“ืช ืฉืœ ืงื‘ืฆื™ื ืืœื• ื•ืžื‘ืœื™ ืœื”ื’ื“ื™ืจ ืืช ืžืขืจื›ืช ื”-build. ื”ืชื›ื•ื ื” ื”ื—ื“ืฉื” ืžืงืœื” ืขืœ ื”ืคืขืœืช ืชื•ื›ื ื™ื•ืช ืฉื‘ื”ืŸ ื”ืงื•ื“ ืฉืœ ืžื—ืœืงื•ืช ืฉื•ื ื•ืช ืžื•ืคืจื“ ืœืงื‘ืฆื™ื ื ืคืจื“ื™ื. Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println("Hello!"); } }

    ืœื“ื•ื’ืžื”, ื›ื“ื™ ืœื”ืจื™ืฅ ืชื•ื›ื ื™ืช ื”ืžื•ืจื›ื‘ืช ืžืฉื ื™ ืงื‘ืฆื™ื "Prog.java" ื•-"Helper.java" ืžืกืคื™ืง ื›ืขืช ืœื”ืจื™ืฅ ืืช "java Prog.java", ืืฉืจ ื™ืงืžืคืœ ืืช ื”ืžื—ืœืงื” Prog, ื™ื’ื“ื™ืจ ื”ืคื ื™ื” ืœืžื—ืœืงื” Helper, ืžืฆื ื•ื”ื™ื“ื•ืจ ืงื•ื‘ืฅ Helper.java ื•ืงืจื™ืื” ืœืฉื™ื˜ื” ื”ืจืืฉื™ืช.

  • ื”ื•ืกืคื” ื™ื™ืฉื•ื ืจืืฉื•ื ื™ ืฉื ื™ ืฉืœ String Templates, ืฉื™ื•ืฉื ื‘ื ื•ืกืฃ ืœืžื—ืจื•ื–ื•ืช ืžื™ืœื•ืœื™ื•ืช ื•ื‘ืœื•ืฉื™ ื˜ืงืกื˜. ืชื‘ื ื™ื•ืช ืžื—ืจื•ื–ื•ืช ืžืืคืฉืจื•ืช ืœืฉืœื‘ ื˜ืงืกื˜ ืขื ื‘ื™ื˜ื•ื™ื™ื ื•ืžืฉืชื ื™ื ืžื—ื•ืฉื‘ื™ื ืžื‘ืœื™ ืœื”ืฉืชืžืฉ ื‘ืื•ืคืจื˜ื•ืจ +. ื”ื—ืœืคืช ื‘ื™ื˜ื•ื™ื™ื ืžืชื‘ืฆืขืช ื‘ืืžืฆืขื•ืช ื”ื—ืœืคื•ืช \{..}, ื•ื ื™ืชืŸ ืœื—ื‘ืจ ืžื˜ืคืœื™ื ืžื™ื•ื—ื“ื™ื ื›ื“ื™ ืœื‘ื“ื•ืง ืืช ื ื›ื•ื ื•ืช ื”ืขืจื›ื™ื ื”ืžื•ื—ืœืคื™ื. ืœื“ื•ื’ืžื”, ืžื ื•ืข ื”-SQL ื‘ื•ื“ืง ืืช ื”ืขืจื›ื™ื ื”ืžื•ื—ืœืคื™ื ื‘ืงื•ื“ ื”-SQL ื•ืžื—ื–ื™ืจ ืื•ื‘ื™ื™ืงื˜ java.sql.Statement ื›ืคืœื˜, ื‘ืขื•ื“ ืฉืžืขื‘ื“ ื”-JSON ืขื•ืงื‘ ืื—ืจ ื ื›ื•ื ื•ืช ื”ื—ืœืคื•ืช ื”-JSON ื•ืžื—ื–ื™ืจ JsonNode. string query = "SELECT * FROM Person p WHERE p." + ืžืืคื™ื™ืŸ + " = '" + ืขืจืš + "'"; // was Statement query = SQL."""SELECT * FROM Person p WHERE p.\{property} = '\{value}'""""; // ื”ืคื›ืชื™
  • ื ื•ืกืคื” ืชืฆื•ื’ื” ืžืงื“ื™ืžื” ืฉื‘ื™ืขื™ืช ืฉืœ ื”-Vector API, ื”ืžืกืคืงืช ืคื•ื ืงืฆื™ื•ืช ืœื—ื™ืฉื•ื‘ื™ื ื•ืงื˜ื•ืจื™ื™ื ื”ืžื‘ื•ืฆืขื™ื ื‘ืืžืฆืขื•ืช ื”ื•ืจืื•ืช ื•ืงื˜ื•ืจื™ื•ืช ื‘ืžืขื‘ื“ื™ x86_64 ื•-AArch64 ื•ืžืืคืฉืจื•ืช ืœื”ื—ื™ืœ ืคืขื•ืœื•ืช ื‘ื•-ื–ืžื ื™ืช ืขืœ ืžืกืคืจ ืขืจื›ื™ื (SIMD). ื‘ื ื™ื’ื•ื“ ืœื™ื›ื•ืœื•ืช ื”ื ื™ืชื ื•ืช ื‘ืžื”ื“ืจ HotSpot JIT ืขื‘ื•ืจ ื•ืงื˜ื•ืจื™ื–ืฆื™ื” ืื•ื˜ื•ืžื˜ื™ืช ืฉืœ ืคืขื•ืœื•ืช ืกืงืœืจื™ื•ืช, ื”-API ื”ื—ื“ืฉ ืžืืคืฉืจ ืœืฉืœื•ื˜ ื‘ืฆื•ืจื” ืžืคื•ืจืฉืช ื‘-Vectorization ืขื‘ื•ืจ ืขื™ื‘ื•ื“ ื ืชื•ื ื™ื ืžืงื‘ื™ืœื™.
  • ื ื•ืกืคื” ื™ื™ืฉื•ื ืจืืฉื•ื ื™ ืฉืœ ื”-API ื”ืžื•ืจื—ื‘ ืฉืœ Stream ื”ืชื•ืžืš ื‘ื”ื’ื“ืจืช ืคืขื•ืœื•ืช ื‘ื™ื ื™ื™ื ืžืฉืœืš, ืžื” ืฉืขืฉื•ื™ ืœื”ื™ื•ืช ืฉื™ืžื•ืฉื™ ื‘ืžืงืจื™ื ืฉื‘ื”ื ืคืขื•ืœื•ืช ื‘ื™ื ื™ื™ื ืžื•ื‘ื ื•ืช ืงื™ื™ืžื•ืช ืื™ื ืŸ ืžืกืคื™ืงื•ืช ืœืฉื™ื ื•ื™ ื”ื ืชื•ื ื™ื ื”ืจืฆื•ื™. ืžื˜ืคืœื™ื ืžืงื•ืžื™ื™ื ืžื—ื•ื‘ืจื™ื ื‘ืืžืฆืขื•ืช ืคืขื•ืœืช ื”ื‘ื™ื ื™ื™ื ื”ื—ื“ืฉื” Stream::gather(Gatherer), ื”ืžืขื‘ื“ืช ืจื›ื™ื‘ื™ ื–ืจื™ืžื” ืขืœ ื™ื“ื™ ื”ื—ืœืช ืžื˜ืคืœ ืฉืฆื•ื™ืŸ ืขืœ ื™ื“ื™ ื”ืžืฉืชืžืฉ ืขืœื™ื”ื. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  • ื”ื•ืฆืขื” ืœื‘ื“ื™ืงื” ื’ืจืกื” ืฉื ื™ื™ื” ืฉืœ ื”-API ื”ื ื™ืกื™ื•ื ื™ ืœ-Structured Concurrency, ืืฉืจ ืžืคืฉื˜ืช ืืช ื”ืคื™ืชื•ื— ืฉืœ ื™ื™ืฉื•ืžื™ื ืžืจื•ื‘ื™ื ืขืœ ื™ื“ื™ ืขื™ื‘ื•ื“ ืžืฉื™ืžื•ืช ืžืจื•ื‘ื•ืช ื”ืžื‘ื•ืฆืขื•ืช ื‘ืฉืจืฉื•ืจื™ื ืฉื•ื ื™ื ื›ื‘ืœื•ืง ื™ื—ื™ื“.
  • ื ื•ืกืฃ ื™ื™ืฉื•ื ืจืืฉื•ื ื™ ืฉื ื™ ืฉืœ ืžื—ืœืงื•ืช ืฉื”ื•ื›ืจื–ื• ื‘ืžืจื•ืžื– ื•ืžื•ืคืขื™ื ืœืœื ืฉื ืฉืœ ืฉื™ื˜ืช ื”"ืจืืฉื™ืช", ืฉื™ื›ื•ืœื” ืœื•ื•ืชืจ ืขืœ ื”ืฆื”ืจื•ืช ืฆื™ื‘ื•ืจื™ื•ืช/ืกื˜ื˜ื™ื•ืช, ื”ืขื‘ืจืช ืžืขืจืš ืฉืœ ื˜ื™ืขื•ื ื™ื ื•ื™ืฉื•ื™ื•ืช ืื—ืจื•ืช ื”ืงืฉื•ืจื•ืช ืœื”ืฆื”ืจืช ืžื—ืœืงื”. // ื”ื™ื” ืžื—ืœืงื” ืฆื™ื‘ื•ืจื™ืช HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // ืขื›ืฉื™ื• ืืชื” ื™ื›ื•ืœ ืœื‘ื˜ืœ ืืช main() { System.out.println("Hello, World!"); }
  • ื ื•ืกืคื” ื™ื™ืฉื•ื ืชืฆื•ื’ื” ืžืงื“ื™ืžื” ืฉื ื™ื™ื” ืฉืœ Scoped Values, ื”ืžืืคืฉืจืช ืฉื™ืชื•ืฃ ื ืชื•ื ื™ื ื‘ืœืชื™ ื ื™ืชื ื™ื ืœืฉื™ื ื•ื™ ื‘ื™ืŸ ืฉืจืฉื•ืจื™ื ื•ื”ื—ืœืคืช ื ืชื•ื ื™ื ื‘ื™ืขื™ืœื•ืช ื‘ื™ืŸ ืฉืจืฉื•ืจื™ ืฆืืฆื (ืขืจื›ื™ื ืขื•ื‘ืจื™ื ื‘ื™ืจื•ืฉื”). ืขืจื›ื™ื ื‘ื”ื™ืงืฃ ืžืคื•ืชื—ื™ื ื›ื“ื™ ืœื”ื—ืœื™ืฃ ืืช ืžื ื’ื ื•ืŸ ื”ืžืฉืชื ื™ื ื”ืžืงื•ืžื™ื™ื ืฉืœ ื”ืฉืจืฉื•ืจ ื•ื”ื ื™ืขื™ืœื™ื ื™ื•ืชืจ ื‘ืขืช ืฉื™ืžื•ืฉ ื‘ืžืกืคืจื™ื ื’ื“ื•ืœื™ื ืžืื•ื“ ืฉืœ ืฉืจืฉื•ืจื™ื ื•ื™ืจื˜ื•ืืœื™ื™ื (ืืœืคื™ ืื• ืžื™ืœื™ื•ื ื™ ืฉืจืฉื•ืจื™ื). ื”ื”ื‘ื“ืœ ื”ืขื™ืงืจื™ ื‘ื™ืŸ ืขืจื›ื™ื ื‘ื”ื™ืงืฃ ืœืžืฉืชื ื™ื ืžืงื•ืžื™ื™ื ื”ื•ื ืฉื”ืจืืฉื•ื ื™ื ื ื›ืชื‘ื™ื ืคืขื ืื—ืช, ืœื ื ื™ืชื ื™ื ืœืฉื™ื ื•ื™ ื‘ืขืชื™ื“, ื•ื ืฉืืจื™ื ื–ืžื™ื ื™ื ืจืง ืœืžืฉืš ื‘ื™ืฆื•ืข ื”ืฉืจืฉื•ืจ.
  • ืื•ืกืฃ ื”ืืฉืคื” ื”ืžืงื‘ื™ืœ ืฉื™ืคืจ ื‘ื™ืฆื•ืขื™ื ื‘ืขื‘ื•ื“ื” ืขื ืžืขืจื›ื™ื ื’ื“ื•ืœื™ื ืฉืœ ื—ืคืฆื™ื. ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืืคืฉืจื” ื‘ื—ืœืง ืžื”ื‘ื“ื™ืงื•ืช ืขื ืžืขืจื›ื™ื ื’ื“ื•ืœื™ื ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ื ืœื”ืคื—ื™ืช ืืช ื”ื”ืฉื”ื™ื” ืœืคื ื™ ืชื—ื™ืœืช ื—ื™ืคื•ืฉ ืื•ื‘ื™ื™ืงื˜ ื‘-20%.

ื‘ื ื•ืกืฃ, ื ื™ืชืŸ ืœืฉื™ื ืœื‘ ืœืคืจืกื•ื ืขื“ื›ื•ืŸ ืœืคืœื˜ืคื•ืจืžื” ืœื™ืฆื™ืจืช ืืคืœื™ืงืฆื™ื•ืช ืขื ืžืžืฉืง ื’ืจืคื™ JavaFX 22.

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”