1. 스위치 표현
이전 릴리스에서 스위치 표현은 "미리 보기" 단계에서만 기능이었습니다. "미리 보기" 단계에 있는 기능의 목적은 피드백을 수집하는 것입니다. 이러한 기능은 언제든지 변경될 수 있으며 피드백 결과에 따라 이러한 기능은 제거될 수도 있지만 일반적으로 모든 미리 보기 기능이 있습니다. 결국 Java에서 수정될 예정입니다.
(권장 튜토리얼: Java 시작하기 프로그램)
새로운 스위치 표현식의 장점은 더 이상 기본 건너뛰기 동작(fall-through)이 없고 더 포괄적이며 표현식과 조합을 작성하기가 더 쉽다는 것입니다. , 따라서 버그가 발생할 가능성은 더 낮습니다. 예를 들어 스위치 표현식은 이제 아래와 같이 화살표 구문을 사용할 수 있습니다.
var log = switch (event) { case PLAY -> "User has triggered the play button"; case STOP, PAUSE -> "User needs a break"; default -> { String message = event.toString(); LocalDateTime now = LocalDateTime.now(); yield "Unknown event " + message + " logged on " + now; } };
2. 텍스트 블록
Java 13에 도입된 미리 보기 기능 중 하나는 텍스트 블록입니다. 텍스트 블록을 사용하면 여러 줄로 구성된 문자열 리터럴을 쉽게 작성할 수 있습니다. 이 기능은 Java 14에서 두 번째 미리 보기로 제공되며 몇 가지 변경 사항이 있습니다. 예를 들어, 여러 줄 텍스트의 형식을 지정하려면 많은 문자열 연결 작업과 이스케이프 시퀀스를 작성해야 할 수 있습니다. 다음 코드는 HTML 예를 보여줍니다.
String html = "<HTML>" + "\n\t" + "<BODY>" + "\n\t\t" + "<H1>\"Java 14 is here!\"</H1>" + "\n\t" + "</BODY>" + "\n" + "</HTML>";
텍스트 블록을 사용하면 이 프로세스를 단순화할 수 있습니다. 텍스트 블록의 시작 및 끝 태그로 삼중따옴표를 사용하면 더욱 우아한 코드를 작성할 수 있습니다.
String html = """ <HTML> <BODY> <H1>"Java 14 is here!"</H1> </BODY> </HTML>""";
텍스트 블록은 일반 문자열 리터럴보다 더 표현력이 뛰어납니다.
Java 14에는 두 가지 새로운 이스케이프 시퀀스가 도입되었습니다. 첫째, 새로운 s 이스케이프 시퀀스를 사용하여 공백을 나타낼 수 있습니다. 둘째, 백슬래시를 사용하면 줄 끝에 개행 문자가 삽입되는 것을 방지할 수 있습니다. 이렇게 하면 긴 줄을 텍스트 블록 내에서 여러 줄로 쉽게 나누어 가독성을 높일 수 있습니다.
예를 들어, 이제 여러 줄 문자열을 작성하는 방법은 다음과 같습니다.
String literal = "Lorem ipsum dolor sit amet, consectetur adipiscing " + "elit, sed do eiusmod tempor incididunt ut labore " + "et dolore magna aliqua.";
텍스트 블록에서 이스케이프 시퀀스를 사용하면 다음과 같이 작성할 수 있습니다.
String text = """ Lorem ipsum dolor sit amet, consectetur adipiscing \ elit, sed do eiusmod tempor incididunt ut labore \ et dolore magna aliqua.\ """;
(비디오 튜토리얼 권장 사항: java 비디오 튜토리얼 )
3. 인스턴스of의 패턴 매칭
Java 14에는 미리보기 기능이 도입되어 인스턴스별로 먼저 판단한 다음 캐스팅하는 코드를 작성할 필요가 없습니다. 예를 들어, 다음 코드는
if (obj instanceof Group) { Group group = (Group) obj; // use group specific methods var entries = group.getEntries(); }
이 미리보기 기능을 사용하여 다음과 같이 리팩터링될 수 있습니다.
if (obj instanceof Group group) { var entries = group.getEntries(); }
조건부 검사에서는 obj가 Group 유형이어야 하므로 obj가 Group 유형이 되도록 지정해야 하는 이유는 무엇입니까? 첫 번째 코드 조각과 같은 조건부 코드 블록? 이로 인해 오류가 발생할 수 있습니다.
이보다 간결한 구문은 Java 프로그램에서 대부분의 캐스트를 제거할 수 있습니다.
JEP 305는 이 변경 사항을 설명하고 Joshua Bloch의 저서 "Effective Java"의 예를 제공하여 다음과 같은 두 가지 동등한 작성 방법을 보여줍니다.
@Override public boolean equals(Object o) { return (o instanceof CaseInsensitiveString) && ((CaseInsensitiveString) o).s.equalsIgnoreCase(s); }
이 코드에서 중복된 CaseInsensitiveString 강제입니다. 유형 변환을 제거하고 다음으로 변환할 수 있습니다. 다음:
@Override public boolean equals(Object o) { return (o instanceof CaseInsensitiveString cis) && cis.s.equalsIgnoreCase(s); }
이 미리보기 기능은 보다 일반적인 패턴 일치에 대한 문을 열어주기 때문에 시도해 볼 가치가 있습니다. 패턴 매칭의 아이디어는 특정 조건에 따라 객체에서 구성 요소를 추출할 수 있는 편리한 구문을 언어에 제공하는 것입니다. 조건은 유형 확인이고 추출 작업에는 적절한 메서드를 호출하거나 특정 필드에 액세스해야 하기 때문에 이것이 바로 instanceof 연산자의 사용 사례입니다.
즉, 이 미리보기 기능은 단지 시작에 불과합니다. 앞으로 이 기능은 확실히 더 많은 코드 중복을 줄여 버그 가능성을 줄일 것입니다.
4. 녹화
또 다른 미리보기 기능은 녹화입니다. 앞서 소개한 다른 미리보기 기능과 마찬가지로 이 미리보기 기능도 중복되는 Java 코드를 줄이는 추세를 따르며 개발자가 보다 정확한 코드를 작성하는 데 도움이 될 수 있습니다. 레코드는 특정 필드의 클래스에 주로 사용됩니다. 변위 기능은 사용자 정의 동작 없이 데이터를 저장하는 것입니다.
본론으로 들어가 가장 간단한 도메인 클래스인 BankTransaction의 예를 들어 보겠습니다. BankTransaction은 거래를 나타내고 날짜, 금액, 설명의 세 가지 필드를 포함합니다. 클래스를 정의할 때 고려해야 할 여러 측면이 있습니다:
Constructor, getter, 메소드 toString(), hashCode() 및 equals() 이러한 부분의 코드는 일반적으로 IDE에 의해 자동으로 생성되며 많은 공간을 차지합니다. 생성된 전체 BankTransaction 클래스는 다음과 같습니다.
public class BankTransaction {private final LocalDate date; private final double amount; private final String description; public BankTransaction(final LocalDate date, final double amount, final String description) { this.date = date; this.amount = amount; this.description = description; } public LocalDate date() { return date; } public double amount() { return amount; } public String description() { return description; } @Override public String toString() { return "BankTransaction{" + "date=" + date + ", amount=" + amount + ", description='" + description + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; BankTransaction that = (BankTransaction) o; return Double.compare(that.amount, amount) == 0 && date.equals(that.date) && description.equals(that.description); } @Override public int hashCode() { return Objects.hash(date, amount, description); } }
Java 14는 이러한 중복성을 해결하고 목적을 보다 명확하게 표현하는 방법을 제공합니다. 이 클래스의 유일한 목적은 데이터를 하나로 모으는 것입니다. Record는 equals, hashCode 및 toString 메소드의 구현을 제공합니다. 따라서 BankTransaction 클래스는 다음과 같이 리팩토링될 수 있습니다.
public record BankTransaction(LocalDate date,double amount, String description) {}
레코드를 통해 생성자 및 getter 메서드는 물론 equals, hashCode 및 toString의 구현을 "자동으로" 가져올 수 있습니다.
이 예제를 시도하려면 미리보기 플래그를 사용하여 파일을 컴파일해야 합니다.
javac --enable-preview --release 14 BankTransaction.javarecord의 필드는 암시적으로 최종입니다. 따라서 레코드 필드를 다시 할당할 수 없습니다. 그러나 이것이 전체 레코드가 변경 불가능하다는 것을 의미하지는 않습니다. 필드에 저장된 객체는 변경 가능합니다.
5. NullPointerException
一些人认为,抛出NullPointerException异常应该当做新的“Hello World”程序来看待,因为NullPointerException是早晚会遇到的。玩笑归玩笑,这个异常的确会造成困扰,因为它经常出现在生产环境的日志中,会导致调试非常困难,因为它并不会显示原始的代码。例如,如下代码:
var name = user.getLocation().getCity().getName();
在Java 14之前,你可能会得到如下的错误:
Exception in thread "main" java.lang.NullPointerExceptionat NullPointerExample.main(NullPointerExample.java:5)
不幸的是,如果在第5行是一个包含了多个方法调用的赋值语句(如getLocation()和getCity()),那么任何一个都可能会返回null。实际上,变量user也可能是null。因此,无法判断是谁导致了NullPointerException。
在Java 14中,新的JVM特性可以显示更详细的诊断信息:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Location.getCity()" because the return value of "User.getLocation()" is nullat NullPointerExample.main(NullPointerExample.java:5)
该消息包含两个明确的组成部分:
后果:Location.getCity()无法被调用原因:User.getLocation()的返回值为null增强版本的诊断信息只有在使用下述标志运行Java时才有效:
-XX:+ShowCodeDetailsInExceptionMessages
下面是个例子:
java -XX:+ShowCodeDetailsInExceptionMessages NullPointerExample
在以后的版本中,该选项可能会成为默认。
这项改进不仅对于方法调用有效,其他可能会导致NullPointerException的地方也有效,包括字段访问、数组访问、赋值等。
위 내용은 java14의 새로운 기능은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!