Java 1.8부터 ::를 통한 메서드 참조가 가능하기 때문에 (이런 참조는 전부 Functional 계열의 인터페이스를 통해 처리됩니다) 자료형 토큰 (MyClass.class 같은 것들) 사용을 줄일 수 있습니다.
다음의 enum 자료형 예제를 보시죠. 각 상수에 해당 상수가 나타내는 Mode의 객체를 반환하는 기능이 들어 있는데, 자료형 토큰 없이도 생성자를 넘기고, 해당 생성자에 따라 객체를 만들 수 있습니다.
생성자는 Supplier<T> 인터페이스를 통해 참조할 수 있습니다. 이 인터페이스는 T get() 메서드를 가지고 있습니다.
interface Encoder {
void init();
void setQuality(int quality);
int getFrameSize();
void encode(Bits bits, float[] data);
}
class NarrowBandEncoder implements Encoder {
@Override
public void init() {
// whatever
}
@Override
public void setQuality(int quality) {
// TODO Auto-generated method stub
}
@Override
public int getFrameSize() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void encode(Bits bits, float[] data) {
// TODO Auto-generated method stub
}
}
class WidebandEncoder implements Encoder {
@Override
public void init() {
// whatever
}
@Override
public void setQuality(int quality) {
// TODO Auto-generated method stub
}
@Override
public int getFrameSize() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void encode(Bits bits, float[] data) {
// TODO Auto-generated method stub
}
}
class UltraWidebandEncoder implements Encoder {
@Override
public void init() {
// whatever
}
@Override
public void setQuality(int quality) {
// TODO Auto-generated method stub
}
@Override
public int getFrameSize() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void encode(Bits bits, float[] data) {
// TODO Auto-generated method stub
}
}
enum EncodingMode {
NARROW_BAND(NarrowBandEncoder::new),
WIDE_BAND(WidebandEncoder::new),
ULTRA_WIDE_BAND(UltraWidebandEncoder::new);
private Supplier<? extends Encoder> encoder;
private EncodingMode(Supplier<? extends Encoder> supplier) {
this.encoder = supplier;
}
public Encoder createEncoder() {
return this.encoder.get();
}
}
잘 보고 갑니다. 오늘도 활기찬 하루 되시길요. ^^
답글