Java8からdefaultメソッドを使用することで、interfaceに実装が持てるようになった。
defaultメソッド内で this
を使うとthisは個別実装クラスを指すことになる。
public interface SampleInterface {
default void sampleDefault() {
System.out.println(this.getClass().getSimpleName());
}
}
public class SampleImpl implements SampleInterface {
public void original() {
}
}
public class Caller {
public void call() {
SampleImpl impl = new SampleImpl();
impl.sampleDefault();
// SampleImplと出力される。
}
}
これは例外のStackTraceを補完する情報として利用できる。
sampleDefault()で例外を投げたとすると、StackTraceには次のようになる。
Exception
at SampleInterface.sampleDefault(SampleInterface.java:行数)
at Caller.call(Caller.java:行数)
この情報だけではSampleImplが実装クラスであるとわからず、Caller.javaの該当行数を見ないといけない。
sampleDefaultの中でthisを使い、Exceptionの引数messageに入れてあげるとすると、StackTraceにSampleImplの情報を表示することができる。