μ΄μ μ 리ν©ν°λ§μ μ§ννλ©΄μ μμ±μ λμ μ μ ν©ν 리 λ©μλλ₯Ό μ¬μ©ν κ²½νμ΄ μλ€. κ·Έ λΉμμλ λ΄λΆ λ‘μ§μ λΆν©νλ μλ―Έλ₯Ό κ°μ§ λ€μ΄λ°μ΄ κ°λ₯νλ€λ μ΄μ νλλ§μΌλ‘ μ μ ν©ν 리 λ©μλλ₯Ό μ¬μ©νλ€. νμ§λ§ μ μ ν©ν 리 λ©μλμλ μ΄λ₯Ό ν¬ν¨ν 5κ°μ§ μ₯μ κ³Ό 2κ°μ§ λ¨μ μ΄ μ‘΄μ¬νλ€.
βοΈ μ μ ν©ν 리 λ©μλμ μ₯μ
1. λ΄λΆ λ‘μ§μ λΆν©νλ μλ―Έλ₯Ό κ°μ§ λ€μ΄λ°μ΄ κ°λ₯νλ€.
μμμ μΈκΈν μ₯μ μΌλ‘ μ μ ν©ν λ§ λ©μλλ λ€μ΄λ° 컨벀μ μ΄ μ‘΄μ¬νλ€.
`from` : νλμ λ§€κ° λ³μλ₯Ό λ°μμ κ°μ²΄λ₯Ό μμ±
`of` : μ¬λ¬κ°μ λ§€κ° λ³μλ₯Ό λ°μμ κ°μ²΄λ₯Ό μμ±
`getInstance` | `instance` : μΈμ€ν΄μ€λ₯Ό μμ±. μ΄μ μ λ°ννλ κ²κ³Ό κ°μ μ μλ€
`newInstance` | `create` : νμ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±
`get[OrderType]` : λ€λ₯Έ νμ μ μΈμ€ν΄μ€λ₯Ό μμ±. μ΄μ μ λ°ννλ κ²κ³Ό κ°μ μ μλ€
`new[OrderType]` : νμ λ€λ₯Έ νμ μ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±
2. νΈμΆ λλ§λ€ μΈμ€ν΄μ€λ₯Ό μλ‘ μμ±νμ§ μμλ λλ€.
미리 μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄λκ±°λ μλ‘ λ§λ μΈμ€ν΄μ€λ₯Ό μΊμ±νλ λ°©λ²μΌλ‘ μ¦μ κ°μ²΄ μμ±μ λ°©μ§ν μ μλ€.
μ΄λ νλΌμ΄μ¨μ΄νΈ ν¨ν΄κ³Ό ν΅μ©λ μ μλ€. νλΌμ΄μ¨μ΄νΈ ν¨ν΄μ΄λ μμ£Ό μ¬μ©λλ μμ±κ³Ό λ³νμ§ μλ μμ±μ λΆλ¦¬νκ³ λ³νμ§ μλ μμ±μ μΊμ±νκ³ μ¬μ¬μ©νμ¬ λ©λͺ¨λ¦¬ μ¬μ©μ μ€μ¬μ£Όλ κ²μ λ§νλ€.
νλΌμ΄μ¨μ΄νΈ ν¨ν΄μ μ¬μ©ν λ, μΌλ°μ μΌλ‘ HashMapμ μ¬μ©ν μΊμ± λ°©λ²μ λ μ¬λ¦΄ κ°λ₯μ±μ΄ λλ€. νμ§λ§ HashMapμ μ¬μ©νλ€λ©΄ κ°ν μ°Έμ‘°λ₯Ό μ μ§νκ² λμ΄ CG λμμ΄ λμ§ μκ³ , κ²°κ³Όμ μΌλ‘ λ©λͺ¨λ¦¬ λμκ° λ°μνκ² λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μλ WeakHashMap λλ SoftReferenceλ₯Ό μ¬μ©ν μ μλ€.
` private static Map<String, SoftReference<TreeModel>> cache = new HashMap<>();`
public class TreeModelFactory {
private static Map<String, SoftReference<TreeModel>> cache = new HashMap<>();
public static TreeModel getTreeModel(String key) {
SoftReference<TreeModel> ref = cache.get(key);
TreeModel model = (ref != null) ? ref.get() : null;
if (model == null) {
model = new TreeModel();
cache.put(key, new SoftReference<>(model));
}
return model;
}
}
3. λ°ν νμ μ νμ νμ κ°μ²΄λ₯Ό λ°νν μ μλ€.
λ°ν νμ μ νμ νμ μ΄κΈ°λ§ νλ©΄ μ΄λ€ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ°νν΄λ μκ΄ μλ€. μλ₯Ό λ€μ΄, EnumSetμ public μμ±μ μμ΄ μ€μ§ μ μ ν©ν λ¦¬λ§ μ 곡νλ€. μ΄λ μμκ° 64κ° μ΄νλ©΄ RegularEnumSetμ μΈμ€ν΄μ€λ₯Ό, 65κ° μ΄μμ΄λ©΄ JumboEnumSetμ μΈμ€ν΄μ€λ₯Ό λ°ννλ€.
μ΄ λ ν΄λΌμ΄μΈνΈλ ν©ν λ¦¬κ° κ±΄λ€μ£Όλ κ°μ²΄κ° μ΄λ ν΄λμ€μ μΈμ€ν΄μ€μΈμ§ μ μλ μκ³ , μ νμλ μλ€
4. λ§€κ° λ³μμ λ°λΌ νμ λ€λ₯Έ κ°μ²΄λ₯Ό λ°νν μ μλ€.
5. μ μ ν©ν 리 λ©μλλ₯Ό μμ±νλ μμ μλ λ°νν κ°μ²΄μ ν΄λμ€κ° μ‘΄μ¬νμ§ μμλ λλ€.
λνμ μΈ μμλ‘ μλΉμ€ μ 곡μ νλ μμν¬μ μλ° κΈ°λ³Έ ꡬνμ²΄μΈ `ServiceLoader`κ° μλ€. μ΄λ μλ μμ μ½λμ κ°μ΄ μ΄λ€ ꡬνμ²΄κ° μ¬μ§ λͺ¨λ₯΄μ§λ§, ν΄λΉ ꡬνμ²΄κ° λ°λ₯΄κ³ μλ μΈν°νμ΄μ€ κΈ°λ°μΌλ‘λ§ μ½λ©μ ν΄μΌλ κ²½μ°μ μ¬μ©λλ©° μ΄λ₯Ό ν΅ν΄ ꡬν체μ μμ‘΄νμ§ μλ μ½λλ₯Ό μμ±ν μ μλ€.
public static void main(String[] args){
ServiceLoader<TempService> loader = ServiceLoader.load(TempService.class);
Optional<TempService> tempServiceOptional = loader.findFirst();
tempServiceOptional.ifPresent(h -> {
System.out.println(h.check());
});
}
βοΈ λ¨μ
1.μμ±μλ₯Ό μ 곡νμ§ μκ³ μ μ ν©ν 리 λ©μλλ§ μ 곡νλ κ²½μ°, νμ ν΄λμ€λ₯Ό λ§λ€ μ μλ€.
μ΄ μ μ½μ μμλ³΄λ€ μ»΄ν¬μ§μ μ μ¬μ©νλλ‘ μ λνλ€.
2. κ°λ°μκ° μ°ΎκΈ° μ΄λ ΅λ€.
μμ±μμ²λΌ API μ€λͺ μ λͺ ννκ² λλ¬λμ§ μκΈ° λλ¬Έμ JavaDocsλ₯Ό νμ©ν΄μ λͺ μν΄μ£Όλ μ΅κ΄μ λ€μ΄μ.
μΈν°νμ΄μ€μ μ μ λ©μλ - μλ° 9λ²μ λΆν° μΈν°νμ΄μ€μ μ μ λ©μλμ default λ©μλλ₯Ό ꡬνν μ μλ€. (μΈν°νμ΄μ€μμ μ κ·Όμ νμλ₯Ό μ μΈν΄μ£Όμ§ μμΌλ©΄ publicμΌλ‘ κ°μ£Όλλ€) μ΄λ‘ μΈν΄ μ νΈλ¦¬ν° ν΄λμ€λ₯Ό ꡬνν μΌμ΄ μ€μ΄λ€μμ§λ§ μΈν°νμ΄μ€μλ Private νλκ°μ μ μΈν μ μκΈ° λλ¬Έμ μ¬μ ν μ νΈλ¦¬ν° ν΄λμ€κ° μ¬μ©λλ κ²½μ°κ° μ‘΄μ¬νλ€.