306: StrictMath

부동 소수점 엄격한 Java.lang.StrictMath 제공

356: Pseudo-Random Number Generation

구조 개선, thread safe

The lack of interfaces in the old API made it harder to switch between different generator implementations. Therefore, it was difficult for third parties to provide their own implementations.

Most of the new generator implementations are not thread-safe. However, both Random and SecureRandom still are.

Thus, in multithreaded environments, we can choose to either:

  • Share an instance of a thread-safe generator
  • Split a new instance from a local source before a new thread is started

We can achieve the second case using a SplittableGenerator:

https://www.baeldung.com/java-17-random-number-generators

382: macOS Rendering

Two major factors motivate the introduction of a new Metal-based rendering pipeline on macOS:

Apple deprecated the OpenGL rendering library in macOS 10.14, in September 2018. Java 2D on macOS is completely reliant on OpenGL for its internal rendering pipeline, so a new pipeline implementation is needed.

Apple claims that the Metal framework, their replacement for OpenGL, has superior performance. For the Java 2D API, this is generally the case with some exceptions.

391: macOs/AArch64 Port, 398: Deprecate tha Applet

403: Strongly Encapsulate JDK Internals

.NET 과 같은 중요한 내부 API 를 제외하고 JDK의 모든 내부 요소를 강력하게 캡슐화합니다

406: Pattern Mathcing for switch

static String formatter(Object o) {
    String formatted = "unknown";
    if (o instanceof Integer i) {
        formatted = String.format("int %d", i);
    } else if (o instanceof Long l) {
        formatted = String.format("long %d", l);
    } else if (o instanceof Double d) {
        formatted = String.format("double %f", d);
    } else if (o instanceof String s) {
        formatted = String.format("String %s", s);
    }
    return formatted;
}
static String formatterPatternSwitch(Object o) {
    return switch (o) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> o.toString();
    };
}

static void testFooBar(String s) {
    switch (s) {
        case null         -> System.out.println("Oops");
        case "Foo", "Bar" -> System.out.println("Great");
        default           -> System.out.println("Ok");
    }
}

https://openjdk.org/jeps/406

407: Remove RMI Activation. (Remote Method Invocation)

409: sealed classes

  • 상속/구현하는 클래스는 final, non-sealed, sealed 중 하나
  • subclass는 동일한 module에 속해야 함, 이름 지정되지 않은 module은 동일한 package
public sealed interface CarBrand permits Hyundai, Kia{}

public final class Hyundai implements CarBrand {}
public non-sealed class Kia implements CarBrand {}

410: Remove the Experimental AOT and JIT Compiler

AOT 또는 JIT 컴파일에 Graal 컴파일러를 사용하려는 개발자는 GraalVM 을 사용할 수 있습니다 .

411: Deprecate the Security Manager for Removal

412: Foreign Function & Memory API (Incubator)

Java 프로그램이 Java 런타임 외부의 코드 및 데이터와 상호 운용할 수 있는 API를 도입합니다. 외부 기능(즉, JVM 외부의 코드)을 효율적으로 호출하고 외부 메모리(즉, JVM에서 관리하지 않는 메모리)에 안전하게 액세스함으로써 API는 Java 프로그램이 기본 라이브러리를 호출하고 불안정성과 위험 없이 기본 데이터를 처리할 수 있도록 합니다.

414: Vector API(Second Incubator)

415: Context-Specific Deserialization Filters

신뢰할 수 없는 데이터를 역직렬화하는 것은 들어오는 데이터 스트림의 내용이 생성되는 개체, 해당 필드의 값 및 개체 간의 참조를 결정하기 때문에 본질적으로 위험한 활동입니다. 많은 일반적인 사용에서 스트림의 바이트는 알 수 없거나 신뢰할 수 없거나 인증되지 않은 클라이언트로부터 수신됩니다. 스트림을 주의 깊게 구성함으로써 공격자는 임의 클래스의 코드가 악의적인 의도로 실행되도록 할 수 있습니다.

Refefence:

https://openjdk.org/projects/jdk/17/

https://www.youtube.com/watch?v=m2ak1zI-M8g

https://www.ciokorea.com/t/21999/%EA%B0%9C%EB%B0%9C%EC%9E%90/256018

https://openjdk.org/projects/jdk/17/jeps-since-jdk-11

'개발자 > v1' 카테고리의 다른 글

스프링 배치 예외처리  (0) 2023.03.07
Kotlin 1.5.0 변경사항  (0) 2021.07.21

+ Recent posts