요즘 자바 8의 람다식 때문인지 지역 클래스(Local Class), 무명 클래스(Anonymous Class), 람다식(Lambda Expression)에서 포획된 지역 변수가 final로 명시되거나 “사실상 final(자바 8에서 명시적으로 final 키워드가 붙지는 않았지만 대대입문으로 값을 바꾸지 않아 사실상 값이 바뀌지 않는 변수를 가리키는 용어)”이어야 하는 이유를 두고 온라인이나 오프라인에서 토론하는 일이 많아졌습니다. 저희 팀에서도 지난 주에 이를 가지고 의견을 주고 받았습니다.
이 때 말한 내용을 조금 자세히 정리해 보겠습니다.
내부 클래스 예제
먼저 간단한 예제 코드를 보겠습니다. 좀 쓸모있는 예제를 작성하려 했지만 역시나 그리 유용한 코드는 아닙니다. 예제로 만든 AsyncPrinter 클래스는 비동기로 문자열을 출력합니다.
package com.fupfin.capvar; import java.io.PrintStream; import java.util.concurrent.*; public class AsyncPrinter { private ExecutorService executor; private PrintStream out; private String prefix; private String suffix; public AsyncPrinter(ExecutorService executor, PrintStream out, String prefix, String suffix) { this.executor = executor; this.out = out; this.prefix = prefix; this.suffix = suffix; } public void printnln(final String str, final int maxlen) { final int len = str.length() > maxlen && maxlen >= 0 ? maxlen : str.length(); executor.submit(new Runnable() { @Override public void run() { out.println(prefix + str.substring(0, len) + suffix); } }); } }