• 카테고리

    질문 & 답변
  • 세부 분야

    기타 (개발 · 프로그래밍)

  • 해결 여부

    해결됨

객체생성 분기문 대신 사용할 ActionEnum or EnumFactory 활용에 관한 질문입니다.

22.02.13 09:07 작성 조회수 135

1

웹서핑 공부중에 어디선가 ActionEnum 의 다양한 예시를 보고 따라서도 적용도 해보고 했었는데요, 그러니까, Enum 내부에 인스턴스 생성코드가 있고, factory 메서드로 해당 타입이 반환되는 다음과 같은 형태 입니다.

public enum ActionEnum {
ACTION_1(SubAction1::new)
, ACTION_2(SubAction2::new)
;
private final Supplier<Action> instantiator;

ActionEnum(Supplier<Action> instantiator) {this.instantiator = instantiator;}

public Action newInstance() {
return instantiator.get();
}
}

이것이 사용되는 곳에서 좀.. 코드가 숨겨지는 효과가 있더라는, 추천하지않는 말을 들었는데요(숨겨지는 효과: 사용되는 곳에서 명확히 드러내지 않아 파악이 힘든 상태)


질문입니다.

Enum 응용패턴이 혹시 안티패턴 이라던지, 적절하지 못한 경우가 특별이 있는지,
사용에 있어 권장되거나 되지 않는 이유와 같은
ActionEnum 혹은 EnumFactory 에 대한 강사님의 견해가 궁금합니다.

 

읽어주셔서 감사합니다.

답변 1

답변을 작성해보세요.

0

보여주신 코드는 Enum 내부에 Supplier를 가지고 있고 그걸 통해 인스턴스를 생성하는 코드 같아 보이네요. 그럼 Action_1.newInstance()를 사용해서 매번 새로운 SubAction1의 인스턴스를 생성할텐데, 인스턴스 생성을 독특하게 하네요.

흠.. 그냥 필요할 때 마다 new SubAction1()을 호출하면 안될 이유가 있거나 해당 객체 생성은 꼭 Action_1이 해야만 하는 이유가 있나요? 그런게 아니라면 왜 저렇게 복잡하게 SubAction1의 인스턴스를 만들어야 하는지 저는 잘 모르겠습니다.

Truestar님은 이런 사용법을 적용하셨다고 하셨는데 어디에 어떻게 적용해서 어떤 효과를 누리고 계신가요?

Truestar님의 프로필

Truestar

질문자

2022.02.15

답변감사드립니다^^
남겨주신 글에대해 이해한데로 말씀드려 볼께요.

아래 예시는 enum  과  분기적인 switch 문의 Action 타입 factory 메서드 코드입니다.


public
Action createActionWithEnum(ActionEnum type) {
return type.newInstance();
}

public Action createActionWithSwitch(ActionEnum type) {
switch (type) {
case ACTION_1:
return new SubAction1();
case ACTION_2:
return new SubAction2();
default:
throw new Error("해당타입을 생성할수 없습니다.");
}
}

 

  • new SubAction1()을 호출하면 안될 이유가 있거나
    해당 객체 생성은 꼭 Action_1이 해야만 하는 이유가 있나요? 

이유가 따로 있지는 않구요, 그저 단순하게 예외를 던질 필요가 없어지고,코드량이 줄어드는 것에 촛점을 맞추고 있었는데요,  
createActionWithEnum(.) 코드가 혹시 가독성을 해지는 것이 아닐까 하고, 우려가 생겨 질문하게 되었습니다.
( 혼자 쓰기에는 좋아보입니다만 공용으로 사용이 가능할지.. )

  •  어디에 어떻게 적용해서 어떤 효과를 누리고 계신가요?

토이프로젝트 에 사용하고 있었습니다.효과는 다형성의 여러 하위클래스를
어디선가 분기적으로 생성해야 될 필요가 있을텐데 이떄 길어지게 될
if 문이나, switch 문 분기로직을 간소화 할때 사용하면 되겠다고 생각했었어요.

 

Enum 활용이 참고된 포스트:

 jojoldu 님의  enum  활용
Enum 활용사례 3가지 (tistory.com)

이외에도 Stackoverflow 에서 enum 관련글을 찾아 보았습니다.

 

enum 타입에 따라 각기 다른 인스턴스를 생성해야 하는 경우였나보군요. 분기분을 줄일 수 있는 적절한 사례로 보이네요. 좋은 예제 공유해 주셔서 감사합니다.

Truestar님의 프로필

Truestar

질문자

2022.02.15

그렇군요!!
의견 감사드립니다😀