Java 15 se tornou GA!

11728 단어 recordjava15sealedjava


2020년 9월 15일 - Java 15 Se torna GA.

이전 미리보기 기능(텍스트 블록, 레코드의 인스턴스에 대한 패턴 일치), Java 15 os conceitos de sealing 클래스 및 로컬 인터페이스 및 열거형 소개 기능이 있습니다.

1. 시작하기



JDK 15를 설치할 때 vamos가 설치됩니다. sdkman JDK 작업 공간으로 사용할 수 있으며 OpenJDK에서 바로 사용할 수 있습니다. este é o link .

sdkman, JDKs disponíveis로 최고의 목록 활용:

sdk list java




Em seguida, basta executar o comando com o 식별자 encontrado:

sdk install java 15.ea.36-open


조속히! JDK를 설치하고 사용하면 문제가 해결됩니다. IntelliJ에서 기본 구성:



2. 봉인된 클래스 및 인터페이스(프리뷰)



Essa 기능은 키워드sealed 및 클래스permits의 인터페이스에서 계층 구조를 제어할 수 있도록 허용합니다. 예시:

sealed public interface Shape permits Circle, Square, Rectangle, Diamond { }


코드가 없습니다. 인터페이스Shape와 마커sealed가 명확합니다. 봉인된 클래스는 키워드 선언permits을 요구하고 컴파일러는 클래스 ou 인터페이스 poderão estender ou implementarShape로 요구합니다. 봉인된 클래스를 요구하는 메시지가 없는 구현으로 예외가 존재합니다. Quando isto ocorre, podemos 생략 a 키워드permits da declaração da sealing class.

Classes cuja classe pai é sealing demandam declarar sua abrangência de hierarquia entre: final , non-sealed ou sealed .

Normalmente, class filhas serão final para evitar que possam ser herdadas. Ao tentar herdar, observará um erro de compilação.

final class Square implements Shape { }

class TimesSquare extends Square { } // Compilador fica chateado, pois Square é final.

record로 최종 클래스를 사용할 수 있는 대체 항목을 사용할 수 있습니다.

record Square() implements Shape { }


estuturas filhas declaradas comonon-sealed가 계층 구조를 확장함에 따라 qualquer 또는 classe ou 인터페이스를 구현하는 것이 가능합니다.

non-sealed interface Diamond extends Shape { }

non-sealed class Circle implements Shape { }

class BigCircle extends Circle { }

interface ColoredDiamond extends Diamond {}


Deve-se atentar que non-sealed classes podem quebrar a coesão de seus modelos, pois voltam a expor tudo o que tentou proteger com sealed.



마지막으로 가장 중요한 것은 봉인된 클래스를 구현하고 봉인된 클래스를 구현하는 것입니다. Dessa forma, não deixamos tão aberto quanto as non-sealed e nem tão engessado quanto as final , continuamos restringindo a herança ou composição.

sealed class Rectangle implements Shape permits CustomRectangle { }

final class CustomRectangle extends Rectangle { }


2.1. 유형 테스트 패턴 매칭



Com o controle de hierarquia que as sealed class proveem ao compilador, seria possível fazer type-test-pattern igual ao que vemos no when do Kotlin .

public Double getAreaOfShape(final Shape shape) {
    return switch (shape) {
        case Circle c -> circleArea(c);
        case Diamond d -> diamondArea(d);
        case Rectangle r -> rectangleArea(r);
        case Square s -> squareArea(s);
    };
}


Atualmente esse código acima não compila, pois type-test-pattern no switch-case não é uma funcionalidade ainda, é apenas uma possibilidade. A razão disso, é por conta do foi adicionado ao Java 14: Pattern Matching for instanceof.

대부분의 경우 컴파일러가 봉인된 클래스를 구현하기 위해 세이버 검사를 수행하는지 확인하고, 기본적으로 스위치 케이스를 생략하거나 생략할 수 있습니다.

3. 로컬 인터페이스 e 열거형



Com a segunda preview de Records (JEP 384 ) assomado no Java 15, a possibilidade de criar estruturas no escopo local de um método virou realidade. Além das records, agora podemos declarar classes, enums e interface dentro do escopo de métodos também!

  public List<TV> getTop5ExpensiveTV(final List<TV> tvs) {

    enum Price {EXPENSIVE, CHEAP}

    record TVPrice(TV tv, Double amount) { 

      Price price() {
        return amount > 4_000 ? Price.EXPENSIVE : Price.CHEAP;
      }
    }

    return tvs.stream()
        .map(tv -> new TVPrice(tv, calculateAmount(tv)))
        .sorted(Comparator.comparing(TVPrice::price))
        .map(TVPrice::tv)
        .limit(5)
        .collect(Collectors.toList());
  }


O exemplo acima mostra uma forma de usufruir de estruturas locais. Foi utilizado local record e enum para fazer um filtro em uma lista.

5. 다음은 무엇입니까?



Existem outras features de melhoria de performance e reimplementações de estruturas, não hesite em ler orelease notes completo .

4. 참조


  • JDK 15
  • Java 15 and IntelliJ IDEA
  • Kotlin docs
  • 좋은 웹페이지 즐겨찾기