item 49 hyowon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
8μ₯ λ©μλ
μ΄λ² μ₯μμλ λ©μλ μ€κ³μ μ£Όμν μ μ μ΄ν΄λ³Ό κ²μ΄λ€. λ ꡬ체μ μΌλ‘λ μ¬μ©μ±, κ²¬κ³ μ±, μ μ°μ±μ λ¬μ±νκΈ° μν΄ λ§€κ°λ³μμ λ°νκ°μ μ²λ¦¬, λ©μλ μκ·Έλμ²μ μ€κ³, λ¬Έμν λ°©λ² λ±μ λ€λ£¬λ€. 8μ₯μ λ΄μ© μ€ μλΉ λΆλΆμ μμ±μμλ μ μ©λ€λ€.
[item 49] 맀κ°λ³μκ° μ ν¨νμ§ κ²μ¬νλΌ
μ΄λ² itemμλ λ©μλ 맀κ°λ³μμ μ²λ¦¬λ°©λ²μ λ€λ£¬λ€.
λ©μλλ μ΅λν λ²μ©μ μΌλ‘ μ€κ³ν΄μΌ νμ§λ§, ꡬννλ €λ κ°λ μμ²΄κ° λ§€κ°λ³μμ μ μ½μ λ΄μ¬ν κ²½μ°λ λλ¬Όμ§ μλ€.
μλ₯Ό λ€λ©΄, μΈλ±μ€ κ°μ μμμ΄λ©΄ μλκ³ , κ°μ²΄ μ°Έμ‘°λ nullμ΄ μλμ΄μΌ νλ€λ μμ΄λ€. μ΄λ° μ μ½μ λ°λμ λ¬Έμνν΄μΌ νλ©°, λ©μλ λͺΈμ²΄κ° μμλκΈ° μ μ κ²μ¬ν΄μΌ νλ€.
μ΄λ μ€λ₯λ κ°λ₯ν 빨리 μ‘μμΌ νλ€λ μΌλ° μμΉκ³Όλ λ§λΏμμλ λ΄μ©μΌλ‘, μ€λ₯λ₯Ό λ°μν μ¦μ μ‘μ§ λͺ»νλ©΄ ν΄λΉ μ€λ₯λ₯Ό κ°μ§νκΈ° μ΄λ €μμ§κ³ , κ°μ§νλλΌλ μ€λ₯μ λ°μ μ§μ μ μ°ΎκΈ° μ΄λ €μμ§λ€.
맀κ°λ³μ μ ν¨μ± κ²μ¬λ₯Ό μ λλ‘ νμ§ λͺ»νλ©΄
μ€ν¨ μμμ±(failure atomicity)μ μ΄κΈΈ μ μλ€.
- λ©μλκ° μνλλ μ€κ°μ λͺ¨νΈν μμΈλ₯Ό λμ§λ©° μ€ν¨ν μ μλ€.
- (λ λμ μν©) λ©μλκ° μ μνλμ§λ§ μλͺ»λ κ²°κ³Όλ₯Ό λ°νν μ μλ€.
- (λμ± λμ μν©) λ©μλλ λ¬Έμ μμ΄ μνλμ§λ§ μ΄λ€ κ°μ²΄λ₯Ό μ΄μν μνλ‘ λ§λ€μ΄μ λ―Έλ μ μ μλ μμ μ μ΄ λ©μλμ κ΄λ ¨μλ μ€λ₯λ₯Ό λΈλ€.
public, protected λ©μλλ 맀κ°λ³μ κ°μ΄ μλͺ»λμ λ λμ§λ μμΈλ₯Ό λ¬Έμνν΄μΌ νλ€. @throws
μλ°λ
νκ·Έλ₯Ό μ¬μ©νκ³ , μμΈ μ’
λ₯λ λ³΄ν΅ IllegalArgumentException
, IndexOutOfException
, NullPointerException
μ€ νλμΌ κ²μ΄λ€.
μμΈλ₯Ό λ¬Έμνν λ μ°Έκ³ ν μ
- 맀κ°λ³μμ μ μ½μ λ¬Έμννλ€λ©΄, μ΄κ²Όμ λ λ°μνλ μμΈλ κΈ°μ νλ€.
- ν΄λμ€ μμ€ μ£Όμ. λͺ¨λ μμΈλ₯Ό κΈ°μ νμ§ μκ³ ν΄λΉ ν΄λμ€ μμ€μ λ§λ μμΈλ₯Ό μ€λͺ
νλ€.
- ex) BigIntegerμ modλ©μλ 맀κ°λ³μκ° nullμ΄λ©΄ NPEλ₯Ό λμ§μ§λ§ μ΄μ λν λ¬Έμνλ νμ§ μλλ€.
μ)
/**
* (νμ¬ κ° mod m) κ°μ λ°ννλ€. μ΄ λ©μλλ
* νμ μμ΄ μλ BigIntegerλ₯Ό λ°ννλ€λ μ μμ remainder λ©μλμ λ€λ₯΄λ€.
*
* @param m κ³μ(μμμ¬μΌ νλ€.)
* @return νμ¬ κ° mod m
* @throws ArithmeticException mμ΄ 0λ³΄λ€ μκ±°λ κ°μΌλ©΄ λ°μνλ€.
*/
public BigInteger mod(BigInteger m) {
if (m.signum() <= 0)
throw new ArithmeticException("κ³μ(m)λ μμμ¬μΌ ν©λλ€. " + m);
... // κ³μ° μν
}
맀κ°λ³μ Null Check λ°©λ²
- (java 7) java.util.Objects.requireNonNull λ©μλ. μνλ μμΈ λ©μΈμ§ μ§μ μ΄ κ°λ₯νκ³ μ λ ₯μ κ·Έλλ‘ λ°ννλ―λ‘ κ°μ μ¬μ©νλ λμμ null κ²μ¬λ₯Ό μνν μ μλ€.
void test(Map<String,Object> param) {
// μ€λ²λ‘λ©μΌλ‘ 3κ°μ§λ‘ ꡬνλΌμ΄ μλ€.
Objects.requireNonNull(param);
Objects.requireNonNull(param, "paramμ λμ
λλ€");
Objects.requireNonNull(param, ()->"paramμ λμ
λλ€.");
}
- (java 9) checkFromIndexSize, checkFromToIndex, checkIndex λ©μλ. μμΈ λ©μμ§λ₯Ό μ§μ ν μ μκ³ , 리μ€νΈμ λ°°μ΄ μ μ©μΌλ‘ μ€κ³λλ€. λ«ν λ²μλ λ€λ£¨μ§ λͺ»νλ€.
int index = 4;
int length = 6;
int size = 2;
int toIndex = 2;
Objects.checkIndex(index, length); // indexλ₯Ό 체ν¬
Objects.checkFromIndexSize(fromIndex,size,length); // fromIndex, fromIndex + size λ₯Ό 체ν¬
Objects.checkFromToIndex(fromIndex,toIndex,length); // fromIndex, toIndex λ₯Ό 체ν¬
- publicμ΄ μλ λ©μλλΌλ©΄ assertλ₯Ό μ¬μ© κ°λ₯.
private static void sort(long a[], int offset, int length) {
assert a != null;
assert offset >= 0 && offset <= a.length;
assert length >= 0 && lenfth <= a.length - offset;
... // κ³μ° μν
}
assertκ° μΌλ°μ μ ν¨μ± κ²μ¬μ λ€λ₯Έ μ
- μ€ν¨νλ©΄ AssertionErrorμ λμ§λ€.
- μ€νμ νΉμ μ΅μ (-ea)μ μ€μΌλ§ μνλκΈ° λλ¬Έμ λ°νμ(μμ©)μμ μλ¬΄λ° ν¨κ³Όλ, μ±λ₯ μ νλ μλ€.
μμ±μ
"λμ€μ μ°λ €κ³ μ μ₯νλ 맀κ°λ³μμ μ ν¨μ±μ κ²μ¬νλΌ"λ μμΉμ νΉμν μ¬λ‘λ€. μμ±μ 맀κ°λ³μμ μ ν¨μ± κ²μ¬λ ν΄λμ€ λΆλ³μμ μ΄κΈ°λ κ°μ²΄κ° λ§λ€μ΄μ§μ§ μκ² νλ λ° κΌ νμνλ€.
맀κ°λ³μ μ ν¨μ±μ κ²μ¬νμ§ μλ κ²½μ°
- μ ν¨μ± κ²μ¬λΉμ©μ΄ μ§λμΉκ² λμ κ²½μ°
- κ³μ° κ³Όμ μμ μ묡μ μΌλ‘ κ²μ¬κ° μνλ κ²½μ°
μλ₯Ό λ€μ΄ Collections.sort(List) μ²λ΄ κ°μ²΄ 리μ€νΈλ₯Ό μ λ ¬νλ λ©μλμ κ²½μ°, 리μ€νΈ μμ κ°μ²΄λ€μ΄ λΉκ΅λ μ μμ΄μΌ νλ€. κ·Έλ°λ° 리μ€νΈμ μ λ ¬ κ³Όμ μμ λΉκ΅κ° μ΄λ€μ§λ―λ‘ κ°μ²΄λ€μ΄ μνΈ λΉκ΅ κ°λ₯νμ§ κ²μ¬νλ κ²μ λ³λ€λ₯Έ μ€μ΅μ΄ μλ€. κ·Έλ¬λ μ묡μ μ ν¨μ±κ²μ¬μ λ무 μμ‘΄νλ€κ° μ€ν¨ μμμ±μ ν΄μΉ μ μμΌλ μ£Όμνμ.
μ 리
λ©μλλ μμ±μλ₯Ό μμ±ν λ 맀κ°λ³μμ μ΄λ€ μ μ½μ΄ μμμ§ μκ°νμ. κ·Έ μ μ½λ€μ λ¬Έμννκ³ λ©μλ μ½λ μμ λΆλΆμμ λͺ μμ μΌλ‘ κ²μ¬ν΄μΌ νλ€. μ€λ₯λ κ°λ₯ν 빨리 λ°μν κ³³μμ μ‘μμΌ νλ€.