요르딩딩
[JAVA] Enum 구현 (2) 본문
728x90
반응형
Enum구현 (1)에서 배운 내용을 토대로 리스트를 활용한 Enum사용법을 공부해보도록 하겠습니다.
1. 리스트를 활용한 Enum
2. 함수를 활용한 Enum
3. 리스트 + 함수를 활용한 Enum
1. 리스트를 활용한 Enum
[EnumType.java]
package com.enumType;
import java.util.Arrays;
import java.util.List;
public enum EnumType {
SUCCESS("200", Arrays.asList("Success0","Success1","Success2")),
FAIL("500", Arrays.asList("False0","False1","False2")),
EMPTY("000", Arrays.asList(""));
private String num;
private List<String> list;
/* [생성자]
* : 생성자의 매개변수로 전달된 값은 this.value를 통해서 인스턴스 변수의 값으로 할당된다.
*/
private EnumType(String num, List<String> list) {
this.num = num;
this.list = list;
}
public static EnumType findEnumType(String num){
return
//EnumType의 Enum 상수들을 순회하며
Arrays.stream(EnumType.values())
//enumType을 갖고 있는게 있는지 확인합니다.
.filter(enumType -> enumType.find(num))
.findAny()
.orElse(EMPTY);
}
public boolean find(String num){
return list.stream()
.anyMatch(list -> list.equals(num));
}
//인스턴스 변수값 반환
public String getNumValue() {
return num;
}
//인스턴스 변수값 반환
public List<String> getListValue() {
return list;
}
}
findEnumType 함수와 find함수를 사용하여 찾고자하는 Value를 가지고 있는 인스턴스를 반환할 수 있습니다.
public void enumtest(HttpServletRequest request) {
System.out.println("EnumType[] values = EnumType.values()");
EnumType[] values = EnumType.values();
System.out.println();
System.out.println("values[0] : " + values[0]);
System.out.println("values[0].ordinal() : " + values[0].ordinal());
System.out.println("EnumType.valueOf(\"SUCCESS\") : " + EnumType.valueOf("SUCCESS"));
System.out.println("EnumType.SUCESS.toString() : " + EnumType.SUCCESS.toString());
System.out.println();
System.out.println("EnumType.SUCCESS.getNumValue() : " + EnumType.SUCCESS.getNumValue());
System.out.println("EnumType.SUCCESS.getListValue() : " + EnumType.SUCCESS.getListValue());
System.out.println();
System.out.println("EnumType.FAIL.getNumValue() : " + EnumType.FAIL.getNumValue());
System.out.println("EnumType.FAIL.getListValue() : " + EnumType.FAIL.getListValue());
System.out.println();
System.out.println("EnumType.findEnumType(\"Success0\") : " + EnumType.findEnumType("Success0"));
System.out.println("EnumType.findEnumType(\"Success1\") : " + EnumType.findEnumType("Success1"));
System.out.println("EnumType.findEnumType(\"Success2\") : " + EnumType.findEnumType("Success2"));
System.out.println("EnumType.findEnumType(\"False0\") : " + EnumType.findEnumType("False0"));
System.out.println("EnumType.findEnumType(\"False1\") : " + EnumType.findEnumType("False1"));
System.out.println("EnumType.findEnumType(\"False2\") : " + EnumType.findEnumType("False2"));
System.out.println("EnumType.findEnumType(\"\") : " + EnumType.findEnumType(""));
}
Enum을 가지고 활용할 수 있는 특징들을 테스트해보았습니다. 아래의 결과를 확인해 봅시다.
[결과]
2. 함수를 활용한 Enum
[EnumType.java]
package com.enumType;
import java.util.Arrays;
import java.util.List;
import org.springframework.cglib.core.internal.Function;
public enum EnumType {
ORIGIN("매출액", origin -> origin),
SUPPLY("공급액", origin -> Math.round(origin.doubleValue()) * 10 /11),
VAT("부가세", origin -> origin / 11),
NOTHING("없음",origin -> 0L);
private final String name;
private final Function<Long, Long> expression;
//생성자
EnumType(String name, Function<Long, Long> expression) {
this.name = name;
this.expression = expression;
}
public long calculate(long origin) {
return expression.apply(origin);
}
}
java8 부터는 함수를 인자로 받을 수 있다고 합니다.
public void enumtest(HttpServletRequest request) {
System.out.println("EnumType.ORIGIN.calculate(0) : " + EnumType.ORIGIN.calculate(100));
System.out.println("EnumType.SUPPLY.calculate(0) : " + EnumType.SUPPLY.calculate(100));
System.out.println("EnumType.VAT.calculate(0) : " + EnumType.VAT.calculate(100));
System.out.println("EnumType.NOTHING.calculate(0) : " + EnumType.NOTHING.calculate(100));
}
[결과]
3. 리스트 + 함수를 활용한 Enum
[EnumType.java]
package com.enumType;
import java.util.Arrays;
import java.util.List;
import org.springframework.cglib.core.internal.Function;
public enum EnumType {
AVG("평균", list -> { return getSum(list) / list.size();} ),
SUM("합계", list -> { return getSum(list);} );
private final String name;
private final Function<List<Integer>, Integer> expression; //Function인터페이스 이용(JAVA 8)
//생성자
EnumType(String name, Function<List<Integer>, Integer> expression) {
this.name = name;
this.expression = expression;
}
private static Integer getSum(List<Integer> list) {
return list.stream() //스트림생성
.reduce(Integer::sum) //.reduce : 결과를 만들어냄, Integer::sum : 합
.get();
}
public Integer calculate(List<Integer> list) {
return expression.apply(list); //.apply : 작업 수행후 리턴
}
}
public void enumtest(HttpServletRequest request) {
System.out.println(EnumType.AVG.calculate(Arrays.asList(1,2,3,4,5)));
System.out.println(EnumType.SUM.calculate(Arrays.asList(1,2,3,4,5)));
}
[결과]
728x90
반응형
'[Java]' 카테고리의 다른 글
[JAVA] LocalDate, System.arraycopy() (0) | 2021.05.14 |
---|---|
[JAVA] startsWith(), endsWith() (0) | 2021.05.10 |
[JAVA] Enum 구현 (1) (0) | 2021.05.04 |
[JAVA] Coalesce (isNull과 친척관계) (0) | 2021.04.06 |
[JAVA Util] ConvertUtils (0) | 2021.04.06 |
Comments