2023. 3. 3. 10:20γJAVA/Effective JAVA
[μ΄νν°λΈ μλ°] Item19. μμμ κ³ λ €ν΄ μ€κ³νκ³ λ¬ΈμννλΌ. κ·Έλ μ§ μμλλΌλ©΄ μμμ κΈμ§νλΌ.
[μ΄νν°λΈ μλ°] Item18. μμ보λ€λ μ»΄ν¬μ§μ μ μ¬μ©νλΌ. (tistory.com)
item18μμλ μμμ μΌλμ λμ§ μκ³ μ€κ³νκ³ μμν λ μ£Όμμ λ λ¬Έμνν΄λμ§ μμ μΈλΆ ν΄λμ€λ₯Ό μμν λμ λ¬Έμ μ μ λν΄μ μκΈ°νκ³ μλ€. (μ΄λ 'μΈλΆ'λ νλ‘κ·Έλλ¨Έμ ν΅μ κΆ λ°μ μμ΄μ μΈμ μ΄λ»κ² λ³κ²½λ μ§ λͺ¨λ₯΄λ μν©μ λ§νλ€.)
1οΈβ£ μμμ© ν΄λμ€λ μ¬μ μν μ μλ λ©μλλ€μ λ΄λΆμ μΌλ‘ μ΄λ»κ² μ΄μ©νλμ§(μκΈ° μ¬μ©) λ¬Έμλ‘ λ¨κ²¨μΌ νλ€.
: λ©μλλ₯Ό μ¬μ μνλ©΄ μ΄λ€ μΌμ΄ μΌμ΄λλμ§λ₯Ό μ νν μ 리νμ¬ λ¬Έμλ‘ λ¨κ²¨μΌ νλ€.
ν΄λμ€μ APIλ‘ κ³΅κ°λ λ©μλμμ ν΄λμ€ μμ μ λ λ€λ₯Έ λ©μλλ₯Ό νΈμΆν μλ μλ€. κ·Έλ°λ° λ§μΉ¨ νΈμΆλλ λ©μλκ° μ¬μ μ κ°λ₯ λ©μλλΌλ©΄ κ·Έ μ¬μ€μ νΈμΆνλ λ©μλμ API μ€λͺ μ μ μν΄μΌ νλ€. κ·Έλ¦¬κ³ μΆκ°λ‘ μ΄λ€ μμλ‘ νΈμΆλλμ§, κ°κ°μ νΈμΆ κ²°κ³Όκ° μ΄μ΄μ§λ μ²λ¦¬μ μ΄λ€ μν₯μ μ£Όλμ§λ λ΄μμΌ νλ€.
λ λκ² λ§νλ©΄ μ¬μ μ κ°λ₯ λ©μλλ₯Ό νΈμΆν μ μλ λͺ¨λ μν©μ λ¬Έμλ‘ λ¨κ²¨μΌ νλ€!!
API λ¬Έμμ λ©μλ μ€λͺ λμ μ’ μ’ "Implemetation Requirements"λ‘ μμνλ μ μ λ³Ό μ μλλ°, κ·Έ λΆλΆμ΄ κ·Έ λ©μλμ λ΄λΆ λμ λ°©μμ μ€λͺ νλ κ³³μ΄λ€. μ΄ μ μ λ©μλ μ£Όμμ @implSpec νκ·Έλ₯Ό λΆμ¬μ£Όλ©΄ μλ°λ λκ΅¬κ° μμ±ν΄μ€λ€.
Implementation Requirementsλ‘ μμνλ μ μμ λ©μλμ λ΄λΆ λμ λ°©μμ λν΄μ μ€λͺ νκ³ μλλ° μ¬κΈ°μλ iterator λ©μλλ₯Ό μ¬μ μνλ©΄ remove λ©μλμ λμμ μν₯μ μ€μ νμ€ν μ μ μλ€.
β κ·Έλ°λ° μ’μ API λ¬Έμλ 'μ΄λ»κ²'κ° μλ '무μ'μ νλμ§λ₯Ό μ€λͺ ν΄μΌ νλ€ λΌλ 격μΈκ³Όλ λ§μ§μλ€. νμ§λ§ μμμ΄ μΊ‘μνλ₯Ό ν΄μΉκΈ° λλ¬Έμ μΌμ΄λκΈ° λ μ΄μ© μ μλ€.. ν΄λμ€λ₯Ό μμ νκ² μμν μ μλλ‘ νλ €λ©΄ λ΄λΆ ꡬν λ°©μμ μ€λͺ ν΄μΌλ§ νλ€.
/**
* item19. μμμ κ³ λ €ν΄ μ€κ³νκ³ λ¬ΈμννλΌ. κ·Έλ μ§ μμλλΌλ©΄ μμμ κΈμ§νλΌ.
* Example class for java documentation for extendable class
*/
public class ExtendableClass
{
/**
* This method can be overridden to print any message
*
* @implSpec
* Please use System.out.println()
*/
public void doSomething()
{
System.out.println("hello");
}
}
@implSpec νκ·Έλ μλ° 8μμ μ²μ λμ λμ΄μ μλ°9λΆν° 본격μ μΌλ‘ μ¬μ©λκΈ° μμνλλ° μλ° 11μ μλ°λ μμλ μ νμ¬νμΌλ‘ λ¨κ²¨μ‘λ€.
λ°λΌμ μ΄ νκ·Έλ₯Ό νμ±ννκΈ° μν΄μλ -tag "implSpec:a:Implementation Requirements:"λ₯Ό μ§μ ν΄μ£Όλ©΄ λλ€.
μλ°λ μ μμ±νκ³ λλ©΄ method detailμμ @implSpec νκ·Έλ₯Ό μ¬μ©ν΄μ μμ±ν λ©μλ λ΄λΆ λμ λ°©μμ λν μ€λͺ μ νμΈν μ μλ€.
2οΈβ£ ν΄λμ€μ λ΄λΆ λμ κ³Όμ μ€κ°μ λΌμ΄λ€ μ μλ ν hook μ μ μ λ³νμ¬ protected λ©μλ ννλ‘ κ³΅κ°ν΄μΌ ν μλ μλ€.
μμμ© ν΄λμ€λ₯Ό μ€κ³ν λ μ΄λ€ λ©μλλ₯Ό protectedλ‘ λ ΈμΆν΄μΌ ν μ§λ μ΄λ»κ² κ²°μ ν κΉ μ λν΄μλ λ΅μ΄ μλ€.
μ¬μ¬μκ΄μ μ μμΈ‘ν λ€μμ μ€μ νμ ν΄λμ€λ₯Ό λ§λ€μ΄ μνν΄λ³΄λ κ²μ΄ μ΅μ μ΄λ€..!!
3οΈβ£ μμμ© ν΄λμ€λ₯Ό μννλ λ°©λ²μ μ§μ νμ ν΄λμ€λ₯Ό λ§λ€μ΄λ³΄λ κ²μ΄ 'μ μΌ'νλ€.
4οΈβ£ μμμ©μΌλ‘ μ€κ³ν ν΄λμ€λ λ°°ν¬ μ μ λ°λμ νμ ν΄λμ€λ₯Ό λ§λ€μ΄ κ²μ¦ν΄μΌ νλ€.
5οΈβ£ μμμ© ν΄λμ€μ μμ±μλ μ§μ μ μΌλ‘λ κ°μ μ μΌλ‘λ μ¬μ μ κ°λ₯ λ©μλλ₯Ό νΈμΆν΄μλ μλλ€.
: μ΄ κ·μΉμ μ΄κΈ΄λ€λ©΄ μ€λμν κ²μ΄λ€!!
public class Super
{
/**
* μ¬μ μ κ°λ₯ λ©μλλ₯Ό νΈμΆνλ μμ±μ -> λ°λΌνλ©΄ x
*/
public Super()
{
overrideMe(); // μμ±μκ° μ¬μ μ κ°λ₯ν λ©μλλ₯Ό νΈμΆνκ³ μλ€.
}
public void overrideMe()
{
}
}
public final class Sub extends Super
{
// μ΄κΈ°νλμ§ μμ final νλ, μμ±μμμ μ΄κΈ°ννλ€.
private final Instant instant;
Sub()
{
instant = Instant.now();
}
// μ¬μ μ κ°λ₯ν λ©μλ. μμ ν΄λμ€μ μμ±μκ° νΈμΆνλ€.
@Override
public void overrideMe()
{
System.out.println(instant);
}
public static void main(String[] args)
{
Sub sub = new Sub();
sub.overrideMe();
}
}
Subμ Super ν΄λμ€μ νμ ν΄λμ€λ‘ override λ©μλλ₯Ό μ¬μ μνλ€.
mainμμ subμ λμ λ°©μμ μμΈ‘ν΄λ³΄λ©΄ instant μκ° 2λ² μΆλ ₯λ κ²μ΄λΌκ³ μκ°νλ€.
νμ§λ§ μΆλ ₯ κ²°κ³Όλ₯Ό νμΈν΄λ³΄λ©΄
μ΄λ κ² λμνλ μ΄μ λ μμ ν΄λμ€μ μμ±μκ° νμ ν΄λμ€μ μμ±μλ³΄λ€ λ¨Όμ μ€νλλ―λ‘ νμ ν΄λμ€μμ μ¬μ μν λ©μλκ° νμ ν΄λμ€μ μμ±μλ³΄λ€ λ¨Όμ νΈμΆνλ€.
μ΄λ κ·Έ μ¬μ μν λ©μλκ° νμ ν΄λμ€μ μμ±μμμ μ΄κΈ°ννλ κ°μ μμ‘΄νλ€λ©΄ μλλλ‘ λμνμ§ μκ² λλ€..
μ¬κΈ°μλ μμ ν΄λμ€μ μμ±μλ νμ ν΄λμ€μ μμ±μκ° μΈμ€ν΄μ€ νλλ₯Ό μ΄κΈ°ννκΈ°λ μ μ overrideMe λ₯Ό νΈμΆνκΈ° λλ¬Έμ 첫λ²μ§Έ κ°μ nullμ΄ μΆλ ₯λλ€.
6οΈβ£ ν΄λμ€λ₯Ό μμμ©μΌλ‘ μ€κ³νλ €λ©΄ μμ²λ λ Έλ ₯μ΄ λ€κ³ κ·Έ ν΄λμ€μ μκΈ°λ μ μ½λ μλΉνλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ κ°μ₯ μ’μ λ°©λ²μ μμμ©μΌλ‘ μ€κ³νμ§ μμ ν΄λμ€λ μμμ κΈμ§νλ κ²μ΄λ€.
: μμμ κΈμ§νλ λ°©λ²μ λκ°μ§λ‘ 첫λ²μ§Έλ ν΄λμ€λ₯Ό finalλ‘ μ μΈνλ λ°©λ²μ΄κ³ , λλ²μ§Έλ λͺ¨λ μμ±μλ₯Ό privateλ package-privateλ‘ μ μΈνκ³ public μ μ ν©ν°λ¦¬ λ©μλλ₯Ό λ§λ€μ΄μ£Όλ λ°©λ²μ΄λ€.
π μ 리
μμμ© ν΄λμ€λ₯Ό μ€κ³νλ€λ κ²μ ν΄λμ€ λ΄λΆμμ μ€μ€λ‘λ₯Ό μ΄λ»κ² μ¬μ©νλμ§ λͺ¨λ λ¬Έμλ‘ λ¨κ²¨μΌ νκ³ , μΌλ¨ λ¬Έμνν κ²μ κ·Έ ν΄λμ€κ° μ°μ΄λ ν λ°λμ μ§μΌμ ΈμΌ νλ€. (κ·Έλ μ§ μμΌλ©΄.. κ·Έ λ΄λΆ ꡬν λ°©μμ λ―Ώκ³ νμ©νλ νμ ν΄λμ€μμ μ€λμμ λ§λ€μ μλ€.)
λ°λΌμ ν΄λμ€λ₯Ό νμ₯ν΄μΌ νλ λͺ νν μ΄μ κ° λ μ€λ₯΄μ§ μλλ€λ©΄ μμμ κΈμ§νλ κ²μ΄ λ λμ κ²μ΄λ€.
μμμ κΈμ§νλ λ°©λ²μΌλ‘λ ν΄λμ€λ₯Ό finalλ‘ μ μΈνκ±°λ μμ±μ λͺ¨λλ₯Ό μΈλΆμμ μ κ·Όν μ μλλ‘ λ§λ€λ©΄ λλ€.