ν΄λμ€λ μμ±μμ λ³λλ‘ μ μ ν©ν°λ¦¬ λ©μλ(static factory method)λ₯Ό μ 곡ν μ μλ€. λμμΈ ν¨ν΄μ ν©ν°λ¦¬ λ©μλ
μλ λ€λ₯΄λ€.
μ₯μ
1. μ΄λ¦μ κ°μ§ μ μλ€.
μμ±μμ λκΈ°λ 맀κ°λ³μμ μμ±μλ§μΌλ‘λ λ°νλ κ°μ²΄μ νΉμ±μ μ λλ‘ μ€λͺ
νμ§ λͺ»νλ€.
νμ§λ§ μ μ ν©ν°λ¦¬ λ©μλλ λ°νλ κ°μ²΄μ νΉμ±μ λ©μλλͺ
μ ν΅ν΄ λλ¬λΌ μ μλ€.
- Exmaple - μμ±μ
public Cars(List<String> names) { validateNonDuplicatedNames(names); for (String name : names) { cars.add(new Car(name)); } } private void validateNonDuplicatedNames(final List<String> names) { if (new HashSet<>(names).size() != names.size()) { throw new IllegalArgumentException("μ€λ³΅λ μλμ°¨ μ΄λ¦μ λλ€."); } }
- Example -μ μ ν©ν°λ¦¬ λ©μλ
public static Cars makeFromCarNames(final List<Name> carNames) { List<Car> cars = carNames.stream() .map(Car::new) .collect(Collectors.toList()); return new Cars(cars); }
μλμ°¨μ μ΄λ¦λ€λ‘ μλμ°¨ κ°μ²΄λ₯Ό μμ±νλ νλμ λ λͺ νν λλ¬λΈλ€.
2. νΈμΆλ λλ§λ€ μΈμ€ν΄μ€λ₯Ό μλ‘ μμ±νμ§ μμλ λλ€.
μ΄ λλΆμ λΆλ³ ν΄λμ€λ μΈμ€ν΄μ€λ₯Ό 미리 λ§λ€μ΄ λκ±°λ μλ‘ μμ±ν μΈμ€ν΄μ€λ₯Ό μΊμ±νμ¬
μ¬νμ©νλ μμΌλ‘ λΆνμν κ°μ²΄ μμ±μ νΌν μ μλ€.
- Example -
Boolean.valueOf()
λ κ°μ²΄λ₯Ό μμ μμ±νμ§ μλλ€.public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); }
λ§μ½ μμ± λΉμ©μ΄ ν° κ°μ κ°μ²΄κ° μμ£Ό μμ²λλ μν©μΌ λ μ μ ν©ν°λ¦¬ λ©μλλ₯Ό μ΄μ©νλ©΄ μ±λ₯ ν₯μμ κΈ°λν μ μλ€.
λν μΈμ μ΄λ μΈμ€ν΄μ€λ₯Ό μ΄μμκ² ν μ§λ₯Ό μ² μ ν ν΅μ ν μ μλ€. (μΈμ€ν΄μ€ ν΅μ ν΄λμ€)
π€ μΈμ€ν΄μ€λ₯Ό ν΅μ νλ μ΄μ ?
- Singleton ν¨ν΄μΌλ‘ λ§λ€μ μλ€.
- μΈμ€ν΄μ€ν λΆκ°λ‘ λ§λ€ μ μλ€.
- λΆλ³ ν΄λμ€μμ λμΉμΈ μΈμ€ν΄μ€κ° λ¨ νλλΏμμ 보μ₯ν μ μλ€. (a == bμΌ λλ§ a.equals(b)κ° μ±λ¦½)
3. λ°ν νμ μ νμ νμ κ°μ²΄λ₯Ό λ°νν μ μλ λ₯λ ₯μ΄ μλ€.
λ°νν κ°μ²΄μ ν΄λμ€λ₯Ό μμ λ‘κ² μ νν μ μκ²νλ μμ²λ μ μ°μ±μ μ 곡νλ€.
μ΄λ λ°ννλ νμ
μ μΈν°νμ΄μ€ νμ
μΌλ‘ ν κ²½μ°, ν΄λΉ μΈν°νμ΄μ€λ₯Ό ꡬννλ
λ€λ₯Έ νμ
μ κ°μ²΄λ€μ λ°νν μ μμμ λ§νλ€. (μμ)
νΉν APIλ₯Ό λ§λ€ λ μ΄ μ μ°μ±μ μμ©νλ©΄ ꡬν ν΄λμ€λ₯Ό 곡κ°νμ§ μκ³ λ κ·Έ κ°μ²΄λ₯Ό
λ°νν μ μμ΄ APIλ₯Ό μκ² μ μ§ν μ μλ€.
μ΄λ μΈν°νμ΄μ€ κΈ°λ° νλ μμν¬λ₯Ό λ§λλ ν΅μ¬ κΈ°μ μ΄κΈ°λ νλ€.
νΉν μλ° μ»¬λ μ
νλ μμν¬λ ν΅μ¬ μΈν°νμ΄μ€λ€μ μμ λΆκ°, λκΈ°ν λ±μ κΈ°λ₯μ
λ§λΆμΈ μ΄ 45κ°μ μ νΈλ¦¬ν° ꡬν체λ₯Ό μ 곡νλλ°,
μ΄ κ΅¬ν체 λλΆλΆμ λ¨ νλμ μΈμ€ν΄μ€ν λΆκ° ν΄λμ€μΈ java.util.Collectoins
μμ μ μ ν©ν°λ¦¬ λ©μλλ₯Ό ν΅ν΄ μ»λλ‘ νλ€.
Collectionμ μμλ°λ λͺ¨λ νμ
μ μΈμ€ν΄μ€κ° 리ν΄λ μ μλ κ²μ΄λ€.
μ μ ν©ν°λ¦¬λ₯Ό μ¬μ©νλ ν΄λΌμ΄μΈνΈλ μ»μ κ°μ²΄λ₯Ό μΈν°νμ΄μ€λ§μΌλ‘ λ€λ£¨κ² λλ€.
4. μ λ ₯ 맀κ°λ³μμ λ°λΌ λ§€λ² λ€λ₯Έ ν΄λμ€μ κ°μ²΄λ₯Ό λ°νν μ μλ€.
λ°ν νμ μ νμ νμ μ΄κΈ°λ§ νλ©΄ μ΄λ€ ν΄λμ€μ κ°μ²΄λ₯Ό λ°ννλ μκ΄μλ€.
- Example -
EnumSet
μnoneOf()
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) { Enum<?>[] universe = getUniverse(elementType); if (universe == null) throw new ClassCastException(elementType + " not an enum"); if (universe.length <= 64) return new RegularEnumSet<>(elementType, universe); else return new JumboEnumSet<>(elementType, universe); }
μμλ‘
EnumSet
ν΄λμ€λ publi μμ±μ μμ΄ μ€μ§ μ μ ν©ν°λ¦¬ λ©μλλ§ μ 곡νλ€.
λ§μ½ μμκ° 64κ° μ΄νμ΄λ©΄ μμλ€μ long λ³μ νλλ‘ κ΄λ¦¬νλ
RegularEnumSet
μ μΈμ€ν΄μ€λ₯Ό,
65κ° μ΄μμ΄λ©΄ long λ°°μ΄λ‘ κ΄λ¦¬νλJunboEnumSet
μ μΈμ€ν΄μ€λ₯Ό λ°ννλ€.
ν΄λΌμ΄μΈνΈλ μ΄ λ ν΄λμ€μ μ‘΄μ¬λ₯Ό λͺ°λΌλ λλ€.
5. μ μ ν©ν°λ¦¬ λ©μλλ₯Ό μμ±νλ μμ μλ λ°νν κ°μ²΄μ ν΄λμ€κ° μ‘΄μ¬νμ§ μμλ λλ€.
μ΄λ° μ μ°ν¨μ μλΉμ€ μ 곡μ νλ μμν¬λ₯Ό λ§λλ κ·Όκ°μ΄ λλ€.
λνμ μΈ μλΉμ€ μ 곡μ νλ μμν¬λ‘λ JDBCκ° μλλ°,
μλΉμ€ μ 곡μ νλ μμν¬μμμ μ 곡μλ μλΉμ€μ ꡬν체μ΄λ€.
κ·Έλ¦¬κ³ μ΄ κ΅¬ν체λ€μ ν΄λΌμ΄μΈνΈμ μ 곡νλ μν μ ν΅μ νμ¬,
ν΄λΌμ΄μΈνΈλ₯Ό ꡬν체λ‘λΆν° λΆλ¦¬ν΄μ€λ€.
β μλΉμ€ μ 곡μ νλ μμν¬μ 3κ° ν΅μ¬ μ»΄ν¬λνΈ
- μλΉμ€ μΈν°νμ΄μ€ : ꡬν체μ λμμ μ μνλ€.
- μ 곡μ λ±λ‘ API : μ 곡μκ° κ΅¬ν체λ₯Ό λ±λ‘ν λ μ¬μ©νλ€.
- μλΉμ€ μ κ·Ό API : ν΄λΌμ΄μΈνΈκ° μλΉμ€μ μΈμ€ν΄μ€λ₯Ό μ»μ λ μ¬μ©νλ€.
ν΄λΌμ΄μΈνΈλ μλΉμ€ μ κ·Ό APIλ₯Ό μ¬μ©ν λ μνλ ꡬν체μ 쑰건μ λͺ
μν μ μλ€.
μ΄ μλΉμ€ μ κ·Ό APIκ° λ°λ‘ μλΉμ€ μ 곡μ νλ μμν¬μ κ·Όκ°μ΄ λλ μ μ ν©ν°λ¦¬ λ©μλλ€.
μ΄μ λλΆμ΄ βμλΉμ€ μ 곡μ μΈν°νμ΄μ€βλΌλ 4 λ²μ§Έ μ»΄ν¬λνΈκ° μ°μ΄κΈ°λ νλ€.
μ΄ μ»΄ν¬λνΈλ μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ₯Ό μμ±νλ ν©ν°λ¦¬ κ°μ²΄λ₯Ό μ€λͺ
ν΄μ€λ€.
JDBCμμλ Connectionμ΄ μλΉμ€ μΈν°νμ΄μ€ μν , DriverManager.registerDriverκ° μ 곡μ λ±λ‘ API μν ,
DriverManager.getConnectionμ΄ μλΉμ€ μ κ·Ό API μν ,
Driverκ° μλΉμ€ μ 곡μ μΈν°νμ΄μ€ μν μ μννλ€.
λ¨μ
1. μμμ νλ €λ©΄ publicμ΄λ protected μμ±μκ° νμνλ μ μ ν©ν°λ¦¬ λ©μλλ§ μ 곡νλ©΄ νμ ν΄λμ€λ₯Ό λ§λ€ μ μλ€.
μμλ‘ Collection νλ μλ€ν¬μ μ νΈλ¦¬ν° ꡬν ν΄λμ€λ€μ μμν μ μλ€.
νμ§λ§ μμλ³΄λ€ μ»΄ν¬μ§μ
μ μ¬μ©νλλ‘ μ λνκ³ , λΆλ³ νμ
μΌλ‘ λ§λ€λλ‘
μ λνλ―λ‘ μ€νλ € μ₯μ μ΄ λ μλ μλ€.
2. νλ‘κ·Έλλ¨Έκ° μ°ΎκΈ° μ΄λ ΅λ€.
μ¬μ©μλ μ μ ν©ν°λ¦¬ λ©μλ λ°©μ ν΄λμ€λ₯Ό μΈμ€ν΄μ€νν λ°©λ²μ μμλ΄μΌ νλ€.
λλ¬Έμ μ μ ν©ν°λ¦¬ λ©μλμ μ΄λ¦ κ·μΉμ μ ν΄λλλ€.
λͺ λͺ κ·μΉ
- from : 맀κ°λ³μλ₯Ό νλ λ°μ ν΄λΉ νμ
μ μΈμ€ν΄μ€λ₯Ό λ°ννλ νλ³ν λ©μλ
ex)Date d = Date.from(instant);
- of : μ¬λ¬ 맀κ°λ³μλ₯Ό λ°μ μ ν©ν νμ
μ μΈμ€ν΄μ€λ₯Ό λ°ννλ μ§κ³ λ©μλ
ex)
Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING);
- valueOf : fromκ³Ό ofμ λ μμΈν λ²μ
ex)
BingInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
- instance / getInstance : (맀κ°λ³μλ₯Ό λ°λλ€λ©΄) 맀κ°λ³μλ‘ λͺ
μν μΈμ€ν΄μ€λ₯Ό λ°ννμ§λ§, κ°μ μΈμ€ν΄μ€μμ 보μ₯νμ§λ μλλ€.
ex)
StackWalker luke = StackWalker.getInstance(options);
- create / newInstance : instance / getInstanceμ κ°μ§λ§, λ§€λ² μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±ν΄ λ°νν¨μ 보μ₯νλ€.
ex)
Object newArray = Array.newInstance(calssObject, arrayLen);
- getType : getInstanceμ κ°μΌλ, μμ±ν ν΄λμ€κ° μλ λ€λ₯Έ ν΄λμ€μ ν©ν°λ¦¬ λ©μλλ₯Ό μ μν λ μ΄λ€. βTypeβμ ν©ν°λ¦¬ λ©μλκ° λ°νν κ°μ²΄μ νμ
μ΄λ€.
ex)
FileStore fs = Files.getFileStore(path);
- newType : newInstanceμ κ°μΌλ, μμ±ν ν΄λμ€κ° μλ λ€λ₯Έ ν΄λμ€μ ν©ν°λ¦¬ λ©μλλ₯Ό μ μν λ μ΄λ€. βTypeβμ ν©ν°λ¦¬ λ©μλκ° λ°νν κ°μ²΄μ νμ
μ΄λ€.
ex)
BufferedReader br = Files.newBufferedReader(path);
- type : getTypeκ³Ό newTypeμ κ°κ²°ν λ²μ
ex)
List<Complaint> litany = Collections.list(legacyLintany);