Languages/Java2014.08.04 23:44

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();

}

}



저작자 표시 비영리 변경 금지
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. 잘 보고 갑니다. 오늘도 활기찬 하루 되시길요. ^^

    2014.08.04 23:54 신고 [ ADDR : EDIT/ DEL : REPLY ]