μ΄μ κΈ
- λ³κ²½ κ°λ₯μ±μ μ΅μννλΌ(λΆλ³ ν΄λμ€λ₯Ό λ§λλ λ€μ― κ°μ§ κ·μΉ)(1) - [4μ₯. ν΄λμ€μ μΈν°νμ΄μ€(μμ΄ν 17)]
- λ³κ²½ κ°λ₯μ±μ μ΅μννλΌ(λΆλ³ ν΄λμ€μ μ₯μ , λ¨μ , λ¨μ λμ² λ°©λ²)(2) - [4μ₯. ν΄λμ€μ μΈν°νμ΄μ€(μμ΄ν 17)]
μ΄λ² κΈμμλ 'λΆλ³ ν΄λμ€λ₯Ό λ§λ€ λ κ³ λ €ν κ²'μ λν΄μ μμ보μ.
1. μμμ λ§μ μ μλ λ λ€λ₯Έ λ°©λ² π¦
μ΄μ κΈμ ν΅ν΄ λΆλ³ ν΄λμ€λ₯Ό 보μ₯νλ €λ©΄ μμ μ μμνμ§ λͺ»νκ² ν΄μΌ νλ€λ κ²μ μ μ μμλ€. μμ μ μμνμ§ λͺ»νκ² νλ κ°μ₯ μ¬μ΄ λ°©λ²μΌλ‘ final ν΄λμ€μ λν΄μ μμ보μλ€.
νμ§λ§ λ μ μ°ν λ°©λ²μ΄ μλ€. λͺ¨λ μμ±μλ₯Ό private νΉμ package-privateμΌλ‘ λ§λ€κ³ public μ μ ν©ν°λ¦¬λ₯Ό μ 곡νλ λ°©λ²μ΄λ€.
// 1. private μμ±μ
public class Complex {
private final double re;
private final double im;
private Complex(double re, double im) {
this.re = re;
this.im = im;
}
// λ΄λΆ ν΄λμ€μμ μμ κ°λ₯
private static class MyComplex extends Complex {
private MyComplex(double re, double im){
super(re, im);
}
}
...
}
// 2. package-private μμ±μ
package com.item17;
public class Complex {
private final double re;
private final double im;
Complex(double re, double im) {
this.re = re;
this.im = im;
}
}
----------
// κ°μ ν¨ν€μ§μμ μμ κ°λ₯
package com.item17; // κ°μ ν¨ν€μ§
public class MyComplex extends Complex {
MyComplex(double re, double im) {
super(re, im);
}
}
μμ±μλ₯Ό 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;
}
private static class MyComplex extends Complex {
private MyComplex(double re, double im){
super(re, im);
}
}
// μ μ ν©ν°λ¦¬
public static Complex valueOf(double re, double im){
return new Complex(re, im);
}
...
}
----------
public static void main(String[] args) {
Complex complex = Complex.valueOf(1, 0.5);
}
ν΄λΉ λ°©μμ μ¬μ©νλ©΄ 2κ°μ§ μ₯μ μ κ°μ§ μ μλ€.
π μ₯μ 1. μ μ°νλ€.
μ΄μ²λΌ μ νμ μ΄μ§λ§ μμμ νμ©νκ² λλ€λ©΄ λ€μν ꡬ체μ μΈ ν΄λμ€λ₯Ό λ§λ€ μ μλ€λ μ΄μ μ΄ μλ€. μ μ ν©ν°λ¦¬λ₯Ό μ¬μ©νλ©΄ λ΄λΆμ ꡬν체λ₯Ό λ°κΏ μ μλ€. μλμ²λΌ MyComplexλΌλ κ²μ μ΄μ©νμ¬ κ΅¬ν체λ₯Ό λ°κΏ μ μλ€.
public class Complex {
private final double re;
private final double im;
private Complex(double re, double im) {
this.re = re;
this.im = im;
}
private static class MyComplex extends Complex {
private MyComplex(double re, double im){
super(re, im);
}
}
public static Complex valueOf(double re, double im){
return new MyComplex(re, im); // Complexμμ MyComplexλ‘ λ³κ²½
}
...
}
λ΄λΆμμλ MyComplexλΏλ§ μλλΌ μΌλ§λ μ§ λ€λ₯Έ ꡬνμ²΄λ‘ λ°κΏ μ μλ€. λ΄λΆμμ μ²λ¦¬λλ κ²μ΄κΈ° λλ¬Έμ λ¬Όλ‘ μΈλΆμμλ μλ¬΄λ° λ³κ²½μ λͺ» λλλ€!
μ΄κ²μ΄ final ν΄λμ€λ₯Ό μ¬μ©νλ κ²κ³Ό λΉκ΅ν΄μ λ μ μ°νλ€κ³ νλ μ΄μ μ΄λ€.
π μ₯μ 2. μΊμ± κΈ°λ₯μ μ¬μ©ν μ μλ€.
λ€μ 릴리μ€μμ κ°μ²΄ μΊμ± κΈ°λ₯μ μΆκ°ν΄ μ±λ₯μ λμ΄μ¬λ¦΄ μλ μλ€. μ μ ν©ν°λ¦¬λ₯Ό μ¬μ©νμ λ λ§€λ² μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄ μ£Όλ κ² μλλΌ μΊμ±ν΄ λμ μΈμ€ν΄μ€λ₯Ό 리ν΄ν μ μλ€.
(μΆκ°μ μΌλ‘, μμ Complexμ κ°μ ν΄λμ€λ₯Ό 'μ¬μ€μ final'(=effectively final)μ΄λΌκ³ λΆλ¦°λ€. )
2. μ¬μ μκ° κ°λ₯ν ν΄λμ€λ λ°©μ΄μ μΈ λ³΅μ¬λ₯Ό μ¬μ©ν΄μΌ νλ€. π¦
λΆλ³ ν΄λμ€μΈλ° 'final ν΄λμ€' λλ 'private λλ package-private μμ±μ + μ μ ν©ν°λ¦¬'λ‘ κ΅¬νν΄λμ§ μμ κ²½μ°μλ μ΄λ»κ² ν΄μΌ ν κΉ? μ¦, μμμ νμ©ν΄ λμλ€λ©΄ μ΄λ»κ² ν΄μΌ ν κΉ?
public static BigInteger safeInstance(BigInteger val){
// λ°©μ΄μ 볡μ¬
return val.getClass() == BigInteger.class ?
val : new BigInteger(val.toByteArray());
}
μμ μ½λμμ μΈμλ‘ λ°λ κ°μ²΄μ νμ μ μμΈ‘ν μ μλ€. BigIntegerμ νμ μΈμ€ν΄μ€κ° κ°λ³ κ°μ²΄μΌ μλ μκΈ° λλ¬Έμ΄λ€. μ΄λ° μν©μμ μμ νκ² μ¬μ©νλ €λ©΄ μ λ’°ν μ μλ νμ ν΄λμ€μ μΈμ€ν΄μ€λΌκ³ νμΈλλ©΄, μ΄ μΈμλ€μ κ°λ³μ΄λΌ κ°μ νκ³ λ°©μ΄μ μΌλ‘ 볡μ¬λ₯Ό ν΄μ μ¬μ©ν΄μΌ νλ€.
3. λͺ¨λ 'μΈλΆμ 곡κ°νλ' νλκ° final μ΄μ΄μΌ νλ€. π΄
μμ κΈμμ λΆλ³ ν΄λμ€λ₯Ό λ§λ€κΈ° μν΄ 'λͺ¨λ νλλ₯Ό privateμΌλ‘ μ μΈνλ€'λΌλ κ·μΉμ΄ μμλ€. νμ§λ§ λͺ¨λ νλλΌλ μ μ½μ μ‘°κΈ μνμν¨λ€λ©΄ 'λͺ¨λ μΈλΆμ 곡κ°λμ΄ μλ νλλ finalλ‘ μ μΈνλ€'λΌκ³ ν μ μλ€.
public final class PhoneNumber {
private final short areaCode, prefix, lineNum;
public PhoneNumber(short areaCode, short prefix, short lineNum) {
this.areaCode = areaCode;
this.prefix = prefix;
this.lineNum = lineNum;
}
...
private volatile int hashCode;
@Override
public int hashCode() {
if(this.hashCode != 0){
return hashCode;
}
synchronized (this){
int result = hashCode;
if(result == 0){
result = Short.hashCode(areaCode);
result = 31 * result + Short.hashCode(prefix);
result = 31 * result + Short.hashCode(lineNum);
this.hashCode = result;
}
return result;
}
}
}
μμ κ°μ΄ μ΄λ€ λΆλ³ ν΄λμ€λ κ³μ° λΉμ©μ΄ ν° κ°μ λμ€μ (μ²μ μ°μΌ λ) κ³μ°νμ¬ finalμ΄ μλ νλμ μΊμ ν΄λκΈ°λ νλ€. λκ°μ κ°μ λ€μ μμ²νλ©΄ μΊμ ν΄λ κ°μ λ°ννμ¬ κ³μ° λΉμ©μ μ κ°νλ κ²μ΄λ€.
νμ§λ§ μ΄ λ°©λ²μ κ·Έ κ°μ²΄κ° λΆλ³μ΄κΈ° λλ¬Έμ μ¬μ©ν μ μλλ°, λͺ λ²μ κ³μ°ν΄λ νμ κ°μ κ²°κ³Όκ° λ§λ€μ΄μ§μ΄ 보μ₯λκΈ° λλ¬Έμ΄λ€.
ν΄λΉ κΈμ λ°±κΈ°μ λμ 'μ΄νν°λΈ μλ° μλ²½ 곡λ΅'μ μ°Έκ³ νμμ΅λλ€.