item 38 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
- μ΄κ±° νμ μ κ±°μ λͺ¨λ μν©μμ μ΄ μ± μ΄νμμ μκ°ν νμ μμ μ΄κ±° ν¨ν΄(typesafe enum pattern)λ³΄λ€ μ°μνλ€.
- λ¨, μμΈκ° νλ μμΌλ, νμ μμ μ΄κ±° ν¨ν΄μ νμ₯ν μ μμΌλ μ΄κ±° νμ μ κ·Έλ΄ μ μλ€λ μ μ΄λ€. λ¬λ¦¬ λ§νλ©΄, νμ μμ μ΄κ±° ν¨ν΄μ μ΄κ±°ν κ°λ€μ κ·Έλλ‘ κ°μ Έμ¨ λ€μ κ°μ λ μΆκ°νμ¬ λ€λ₯Έ λͺ©μ μΌλ‘ μΈ μ μλ λ°λ©΄, μ΄κ±° νμ μ κ·Έλ κ² ν μ μλ€λ λ»μ΄λ€.
- μ€μλ‘ μ΄λ κ² μ€κ³ν κ²μ μλλ€. μ¬μ€ λλΆλΆ μν©μμ μ΄κ±° νμ μ νμ₯νλ 건 μ’μ§ μμ μκ°μ΄λ€. νμ₯ν νμ μ μμλ κΈ°λ° νμ μ μμλ‘ μ·¨κΈνμ§λ§ κ·Έ λ°λλ μ±λ¦½νμ§ μλλ€λ©΄ μ΄μνμ§ μμκ°!
- κΈ°λ° νμ κ³Ό νμ₯λ νμ λ€μ μμ λͺ¨λλ₯Ό μνν λ°©λ²λ λ§λ μΉ μλ€.
- λ§μ§λ§μΌλ‘, νμ₯μ±μ λμ΄λ €λ©΄ κ³ λ €ν μμκ° λμ΄λ μ€κ³μ ꡬνμ΄ λ 볡μ‘ν΄μ§λ€.
public class Suit {
private final String name;
public static final Suit CLUBS =new Suit("clubs");
public static final Suit DIAMONDS =new Suit("diamonds");
public static final Suit HEARTS =new Suit("hearts");
public static final Suit SPADES =new Suit("spades");
private Suit(String name){
this.name =name;
}
public String toString(){
return name;
}
}
- μλ μλ° 1.5 λ²μ μμ μμ κ°μ΄ νν μ¬μ©νλ ν¨ν΄μ΄λΌκ³ ν¨.
-
λ°λ‘ μ°μ° μ½λ(operation code νΉμ opcode)λ€. μ°μ° μ½λμ κ° μμλ νΉμ κΈ°κ³κ° μννλ μ°μ°μ λ»νλ€(μμ΄ν 34μ Operation νμ λ κ·Έμ€ νλλ‘, κ°λ¨ν κ³μ°κΈ°μ μ°μ° κΈ°λ₯μ μλ―Ένλ€). μ΄λ°κΈ APIκ° μ 곡νλ κΈ°λ³Έ μ°μ° μΈ μ μ¬μ©μ νμ₯ μ°μ°μ μΆκ°ν μ μλλ‘ μ΄μ΄μ€μΌ ν λκ° μλ€.
-
λ€νν μ΄κ±° νμ μΌλ‘ μ΄ ν¨κ³Όλ₯Ό λ΄λ λ©μ§ λ°©λ²μ΄ μλ€. κΈ°λ³Έ μμ΄λμ΄λ μ΄κ±° νμ μ΄ μμμ μΈν°νμ΄μ€λ₯Ό ꡬνν μ μλ€λ μ¬μ€μ μ΄μ©νλ κ²μ΄λ€.
public interface Operation {
double apply(double x, double y);
}
public enum BasicOperation implements Operation {
PLUS("+") {
public double apply(double x, double y) { return x + y; }
},
MINUS("-") {
public double apply(double x, double y) { return x - y; }
},
TIMES("*") {
public double apply(double x, double y) { return x * y; }
},
DIVIDE("/") {
public double apply(double x, double y) { return x / y; }
};
private final String symbol;
BasicOperation(String symbol) {
this.symbol = symbol;
}
@Override public String toString() {
return symbol;
}
}
- μ΄κ±° νμ μΈ BasicOperationμ νμ₯ν μ μμ§λ§ μΈν°νμ΄μ€μΈ Operationμ νμ₯ν μ μκ³ , μ΄ μΈν°νμ΄μ€λ₯Ό μ°μ°μ νμ μΌλ‘ μ¬μ©νλ©΄ λλ€. μ΄λ κ² νλ©΄ Operationμ ꡬνν λ λ€λ₯Έ μ΄κ±° νμ μ μ μν΄ κΈ°λ³Έ νμ μΈ BasicOperation μ λ체ν μ μλ€.
public enum ExtendedOperation implements Operation {
EXP("^") {
public double apply(double x, double y) {
return Math.pow(x, y);
}
},
REMAINDER("%") {
public double apply(double x, double y) {
return x % y;
}
};
private final String symbol;
ExtendedOperation(String symbol) {
this.symbol = symbol;
}
@Override public String toString() {
return symbol;
}
}
-
μλ‘ μμ±ν μ°μ°μ κΈ°μ‘΄ μ°μ°μ μ°λ κ³³μ΄λ©΄ μ΄λλ μΈ μ μλ€. (Basic Operationμ΄ μλ) Operation μΈν°νμ΄μ€λ₯Ό μ¬μ©νλλ‘ μμ±λμ΄ μκΈ°λ§ νλ©΄λλ€. applyκ° μΈν°νμ΄μ€(Operation)μ μ μΈλμ΄ μμΌλ μ΄κ±° νμ μ λ°λ‘ μΆμ λ©μλλ‘ μ μΈνμ§ μμλ λλ€.
-
μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄ νμ₯ κ°λ₯ν μ΄κ±° νμ μ νλ΄ λ΄λ λ°©μμλ ν κ°μ§ μ¬μν λ¬Έμ κ° μλ€. λ°λ‘ μ΄κ±° νμ λΌλ¦¬ ꡬνμ μμν μ μλ€λ μ μ΄λ€. μ무μνμλ μμ‘΄νμ§ μλ κ²½μ°μλ λν΄νΈ ꡬν(μμ΄ν 20)μ μ΄μ©ν΄ μΈν°νμ΄μ€μ μΆκ°νλ λ°©λ²μ΄ μλ€.
μ΄κ±° νμ μ체λ νμ₯ν μ μμ§λ§, μΈν°νμ΄μ€μ κ·Έ μΈν°νμ΄μ€λ₯Ό ꡬννλ κΈ°λ³Έ μ΄κ±°νμ μ ν¨κ» μ¬μ©ν΄ κ°μ ν¨κ³Όλ₯Ό λΌ μ μλ€.
μ΄λ κ² νλ©΄ ν΄λΌμ΄μΈνΈλ μ΄ μΈν°νμ΄μ€λ₯Ό ꡬνν΄ μμ λ§μ μ΄κ±° νμ (νΉμ λ€λ₯Έ νμ )μ λ§λ€ μ μλ€.
κ·Έλ¦¬κ³ APIκ° (κΈ°λ³Έ μ΄κ±° νμ μ μ§μ λͺ μνμ§ μκ³ ) μΈν°νμ΄μ€ κΈ°λ°μΌλ‘ μμ±λμλ€λ©΄
κΈ°λ³Έ μ΄κ±° νμ μ μΈμ€ν΄μ€κ° μ°μ΄λ λͺ¨λ κ³³μ μλ‘ νμ₯ν μ΄κ±° νμ μ μΈμ€ν΄μ€λ‘ λμ²΄ν΄ μ¬μ©ν μ μλ€.