item 17 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
Effective Java 3e μμ΄ν 17λ₯Ό μμ½ν λ΄μ© μ λλ€.
λΆλ³ ν΄λμ€λ κ°λ³ ν΄λμ€λ³΄λ€ μ€κ³νκ³ κ΅¬ννκ³ μ¬μ©νκΈ° μ¬μ°λ©°, μ€λ₯κ° μκΈΈ μ¬μ§λ μ κ³ ν¨μ¬ μμ νλ€.
ν΄λμ€λ₯Ό λΆλ³μΌλ‘ λ§λ€λ €λ©΄ λ€μ λ€μ― κ°μ§ κ·μΉμ λ°λ₯΄λ©΄ λλ€.
- κ°μ²΄μ μνλ₯Ό λ³κ²½νλ
λ©μλ(λ³κ²½μ)
λ₯Ό μ 곡νμ§ μλλ€. - ν΄λμ€λ₯Ό νμ₯ν μ μλλ‘ νλ€. μμμ λ§λ λνμ μΈ λ°©λ²μ ν΄λμ€λ₯Ό
final
λ‘ μ μΈνλ κ²μ΄μ§λ§, λ€λ₯Έ λ°©λ²λ λ€μ μ΄ν΄λ³Ό κ²μ΄λ€. - λͺ¨λ νλλ₯Ό
final
λ‘ μ μΈνλ€. - λͺ¨λ νλλ₯Ό
private
μΌλ‘ μ μΈνλ€. - μμ μΈμλ λ΄λΆμ
κ°λ³ μ»΄ν¬λνΈ
μ μ κ·Όν μ μλλ‘ νλ€. μ΄λ° νλλ μ λ ν΄λΌμ΄μΈνΈκ° μ 곡ν κ°μ²΄ μ°Έμ‘°λ₯Ό κ°λ¦¬ν€κ² ν΄μλ μ λλ©°, μ κ·Όμ λ©μλκ° κ·Έ νλλ₯Ό κ·Έλλ‘ λ°νν΄μλ μ λλ€. μμ±μ, μ κ·Όμ, readObject λ©μλ λͺ¨λμμλ°©μ΄μ 볡μ¬
λ₯Ό μννλΌ
public final class Complex {
private final double re;
private final double im;
public Complex(double re, double im) {
this.re = re;
this.im = im;
}
...
public Complex plus(Complex c) {
return new Complex(re + c.re, im + c.im);
}
public Complex minus(Complex c) {
return new Complex(re - c.re, im - c.im);
}
public Complex times(Complex c) {
return new Complex(re * c.re - im * c.im, re * c.im + im. * c.re);
}
@Override public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Complex))
return false;
Complex c = (Complex) o;
return Double.compare(c.re, re) == 0
&& Double.compare(c.im, im);
}
μ΄ μ¬μΉμ°μ° λ©μλλ€μ΄ μΈμ€ν΄μ€ μμ μ μμ νμ§ μκ³ μλ‘μ΄ Complex μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄ λ°ννλ λͺ¨μ΅μ μ£Όλͺ©νμ. μ΄μ²λΌ νΌμ°μ°μμ ν¨μλ₯Ό μ μ©ν΄ κ·Έ κ²°κ³Όλ₯Ό λ°ννμ§λ§ νΌμ°μ°μ μ체λ κ·Έλλ‘μΈ νλ‘κ·Έλλ° ν¨ν΄μ ν¨μν νλ‘κ·Έλλ°
μ΄λΌ νλ€. μ΄μ λ¬λ¦¬, μ μ°¨μ νΉμ λͺ
λ Ήν νλ‘κ·Έλλ°μμλ λ©μλμμ νΌμ°μ°μμΈ μμ μ μμ ν΄ μμ μ μνκ° λ³νκ² λλ€.
λΆλ³ κ°μ²΄λ κ·Όλ³Έμ μΌλ‘ μ€λ λ μμ
νμ¬ λ°λ‘ λκΈ°νν νμ μκΈ° λλ¬Έμ μμ¬νκ³ κ³΅μ ν μ μλ€. λ°λΌμ λΆλ³ ν΄λμ€λΌλ©΄ νλ² λ§λ μΈμ€ν΄μ€λ₯Ό μ΅λν μ¬νμ©νκΈ°λ₯Ό κΆνλ€.
λΆλ³ ν΄λμ€λ μμ£Ό μ¬μ©λλ μΈμ€ν΄μ€λ₯Ό μΊμ±
νμ¬ κ°μ μΈμ€ν΄μ€λ₯Ό μ€λ³΅ μμ±νμ§ μκ² ν΄μ£Όλ μ μ ν©ν°λ¦¬λ₯Ό μ 곡ν μ μλ€. μλ‘μ΄ ν΄λμ€λ₯Ό μ€κ³ν λ public μμ±μ λμ μ μ ν©ν°λ¦¬
λ₯Ό λ§λ€μ΄λλ©΄, ν΄λΌμ΄μΈνΈλ₯Ό μμ νμ§ μκ³ λ νμμ λ°λΌ μΊμ κΈ°λ₯μ λμ€μ λ§λΆμΌ μ μλ€.
BigInteger answer = BigInteger.valueOf(42L);
λΆλ³ κ°μ²΄λ μμ λ‘κ² κ³΅μ
ν μ μμμ λ¬Όλ‘ , λΆλ³ κ°μ²΄λΌλ¦¬λ λ΄λΆ λ°μ΄ν°λ₯Ό 곡μ ν μ μλ€. κ°μ²΄λ₯Ό λ§λ€ λ λ€λ₯Έ λΆλ³ κ°μ²΄λ€μ ꡬμ±μμλ‘ μ¬μ©νλ©΄ μ΄μ μ΄ λ§λ€. μ’μ μλ‘, λΆλ³ κ°μ²΄λ 맡μ ν€μ μ§ν©(Set)μ μμλ‘ μ°κΈ°μ μμ±λ§μΆ€μ΄λ€. 맡μ΄λ μ§ν©μ μμ λ΄κΈ΄ κ°μ΄ λ°λλ©΄ λΆλ³μ
μ΄ νλ¬Όμ΄μ§λλ°, λΆλ³ κ°μ²΄λ₯Ό μ¬μ©νλ©΄ κ·Έλ° κ±±μ μ νμ§ μμλ λλ€.
λΆλ³ ν΄λμ€μλ λ¨μ μ μλ€.
κ°μ΄ λ€λ₯΄λ©΄ λ°λμ λ
립λ κ°μ²΄λ‘ λ§λ€μ΄μΌ νλ€λ κ²μ΄λ€. κ°μ κ°μ§μκ° λ§λ€λ©΄ μ΄λ€μ λͺ¨λ λ§λλ λ° ν° λΉμ©
μ μΉμμΌ νλ€.
BigInteger moby = ...;
moby = moby.flipBit(0);
μ΄ λ¬Έμ μ λμ²νλ λ°©λ²μ λ κ°μ§λ€.
첫 λ²μ§Έλ νν μ°μΌ λ€λ¨κ³ μ°μ° λ€μ μμΈ‘
νμ¬ κΈ°λ³Έ κΈ°λ₯μΌλ‘ μ 곡νλ λ°©λ²μ΄λ€. μ΄λ¬ν λ€λ¨κ³ μ°μ°μ κΈ°λ³ΈμΌλ‘ μ 곡νλ€λ©΄ λ μ΄μ κ° λ¨κ³λ§λ€ κ°μ²΄λ₯Ό μμ±νμ§ μμλ λλ€. ν΄λΌμ΄μΈνΈλ€μ΄ μνλ 볡μ‘ν μ°μ° λ€μ μ νν μμΈ‘ν μ μλ€λ©΄ package-privateμ κ°λ³ λλ° ν΄λμ€λ§μΌλ‘ μΆ©λΆνλ€.
μλ° νλ«νΌ λΌμ΄λΈλ¬λ¦¬μμ μ΄μ ν΄λΉνλ λνμ μΈ μκ° λ°λ‘ String
ν΄λμ€λ€. κ·Έλ λ€λ©΄ Stringμ κ°λ³ λλ° ν΄λμ€λ λ°λ‘ StringBuilderμ΄λ€.
κ°λ³ λλ° ν΄λμ€μ λμμ리λ?
ν΄λμ€κ° λΆλ³μμ 보μ₯νλ €λ©΄ μμ μ μμνμ§ λͺ»νκ² final ν΄λμ€
λ‘ μ μΈνλ κ²μ΄μ§λ§ λ μ μ°ν λ°©λ²μ΄ μλ€. λͺ¨λ μμ±μλ₯Ό private
νΉμ package-private
μΌλ‘ λ§λ€κ³ public μ μ ν©ν°λ¦¬
λ₯Ό μ 곡νλ λ°©λ²μ΄λ€.
public class Complex {
private final double re;
private final double im;
private Complex(double re, double im) {
this.re = re;
this.im = im;
}
public static Complex valueOf(double re, double im) {
return new Complex(re,im);
}
...
}
ν¨ν€μ§ λ°κΉ₯μ ν΄λΌμ΄μΈνΈμμ λ°λΌλ³Έ μ΄ λΆλ³ κ°μ²΄λ μ¬μ€μ final
μ΄λ€. public μ΄λ protected μμ±μκ° μμΌλ λ€λ₯Έ ν¨ν€μ§μμλ μ΄ ν΄λμ€λ₯Ό νμ₯νλ κ² λΆκ°λ₯νκΈ° λλ¬Έμ΄λ€.
κ²ν°(getter)κ° μλ€κ³ ν΄μ 무쑰건 μΈν°(setter)λ₯Ό λ§λ€μ§λ λ§μ. ν΄λμ€λ κΌ νμν κ²½μ°κ° μλλΌλ©΄ λΆλ³μ΄μ΄μΌ νλ€.
PhoneNumberμ Complex κ°μ λ¨μν κ° κ°μ²΄λ νμ λΆλ³μΌλ‘ λ§λ€μ. λΆλ³μΌλ‘ λ§λ€ μ μλ ν΄λμ€λΌλ λ³κ²½ν μ μλ λΆλΆμ μ΅μνμΌλ‘ μ€μ΄μ.
κ°μ²΄κ° κ°μ§ μ μλ μνμ μλ₯Ό μ€μ΄λ©΄ κ·Έ κ°μ²΄λ₯Ό μμΈ‘νκΈ° μ¬μ΄μ§κ³ μ€λ₯κ° μκΈΈ κ°λ₯μ±μ΄ μ€μ΄λ λ€.
java.util.concurrent ν¨ν€μ§μ CountDownLatch
ν΄λμ€κ° μ΄μμ μμΉμ μ λ°μ¦νλ€. λΉλ‘ κ°λ³ ν΄λμ€μ§λ§ κ°μ§ μ μλ μνμ μκ° λ§μ§ μλ€.
CountDownLatch ꡬ쑰λ μ΄λ»κ² λμ΄ μλ?