하지만 JDK 9에서는 외부의 변수를 등록할 수 있게 되어 진정한 try~with~resources 문장이 가능해졌다.
private void jdk9(FileOutputStream output) {
try (InputStream input = System.in; output;) {
int read = input.read();
output.write(read);
// Local variable output defined in an enclosing scope must be final or effectively final
//output = new FileOutputStream("test");
} catch (IOException e) {
e.printStackTrace();
}
}
주의할 점은 이런 변수는 final이거나 effectively final이므로 새로 read only로 사용해야 한다.
Handler<Integer> intHandler = new Handler<Integer>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
JDK 9에서는 inner class에도 <>를 사용할 수 있게 되었다.
Handler<? extends Number> intHandler1 = new Handler<>(2) {
@Override
public void handle() {
System.out.println(content);
}
};
interface에 private method 추가 가능
interface에는 JDK8에 추가된 default 메서드나 static 메서드를 통해서 body를 가진 메서드를 작성할 수 있었는데 여러 메서드에서 내부적으로 재활용되는 기능이 있을 때 처리가 애매했다.
JDK9에서는 interface에 구현부가 있는 private method를 추가할 수 있게 되었다.
interface MyMath {
static void add(int a, int b) {
int result = a + b;
print(a, b, '+', result);
}
default void multi(int a, int b) {
print(a, b, '*', a * b);
}
private static void print(int num1, int num2, char oper, int result) {
System.out.println("%d %c %d = %d".formatted(num1, oper, num2, result));
}
}
public class PrivateMethodTest {
public static void main(String[] args) {
MyMath.add(10, 20);
}
}
Unmodifiable Collection 생성
기존에는 수정이 불가한 collection을 작성하기 위해 여러 줄의 코드를 사용했지만 of 라는 메서드르 이용해 간편히 추가할 수 있게 되었다.
// 기존
List<String> originalList = new ArrayList<>();
originalList.add("Apple");
originalList.add("Banana");
originalList.add("Cherry");
List<String> unmodifiableList = Collections.unmodifiableList(originalList);
// JDK 9부터 가능
List<String> list = List.of("Hello", "Java", "World");
Set<String> set = Set.of("Hello", "Java", "World");
Map<String, String> map = Map.of("lang","Java", "ver", "JDK 9");
참고로 unmodifiable collection은 기존 컬렉션을 수정할 수 없도록 만든 뷰의 개념으로 원본 컬렉션의 변경을 방지하기 위해 사용된다. 이를 통해 Collection을 안전하게 공유하고 다른 사용자가 Collection을 수정하지 못하도록 할 수 있다.