item 21 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

Effective Java 3e μ•„μ΄ν…œ 21λ₯Ό μš”μ•½ν•œ λ‚΄μš© μž…λ‹ˆλ‹€.

μžλ°” 8에 μ™€μ„œ κΈ°μ‘΄ μΈν„°νŽ˜μ΄μŠ€μ— λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•  수 μžˆλ„λ‘ λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μ†Œκ°œν–ˆμ§€λ§Œ μœ„ν—˜μ΄ μ™„μ „νžˆ 사라진 것은 μ•„λ‹ˆλ‹€.

μžλ°” 8μ—μ„œλŠ” 핡심 μ»¬λ ‰μ…˜ μΈν„°νŽ˜μ΄μŠ€λ“€μ— λ‹€μˆ˜μ˜ λ””ν΄νŠΈ λ©”μ„œλ“œκ°€ μΆ”κ°€λ˜μ—ˆλ‹€. 주둜 λžŒλ‹€λ₯Ό ν™œμš©ν•˜κΈ° μœ„ν•΄μ„œλ‹€. λŒ€λΆ€λΆ„ μƒν™©μ—μ„œ 잘 λ™μž‘ν•˜μ§€λ§Œ 생각할 수 μžˆλŠ” λͺ¨λ“  μƒν™©μ—μ„œ λΆˆλ³€μ‹μ„ ν•΄μΉ˜μ§€ μ•ŠλŠ” λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μž‘μ„± ν•˜κΈ°λž€ μ–΄λ €μš΄ 법이닀.

λ””ν΄νŠΈ λ©”μ„œλ“œλž€ 무엇인가?

μžλ°” 8μ—μ„œλŠ” ν˜Έν™˜μ„±μ„ μœ μ§€ν•˜λ©΄μ„œ APIλ₯Ό λ°”κΏ€ 수 μžˆλ„λ‘ μƒˆλ‘œμš΄ κΈ°λŠ₯인 λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€. μžλ°” 8 API μ—μ„œλŠ” λ””ν΄νŠΈ λ©”μ„œλ“œκ°€ μƒλ‹Ήνžˆ 많이 ν™œμš© λ˜μ—ˆμ„ 것 μž„μ„ μΆ”μΈ‘ν•  수 μžˆλ‹€. Collection μΈν„°νŽ˜μ΄μŠ€μ˜ stream λ©”μ„œλ“œμ²˜λŸΌ λΆ€μ§€λΆˆμ‹κ°„μ— λ§Žμ€ λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν–ˆλ‹€. List μΈν„°νŽ˜μ΄μŠ€μ˜ sort λ©”μ„œλ“œλ„ λ””ν΄νŠΈ λ©”μ„œλ“œλ‹€. 이전에 μ‚΄νŽ΄λ³Έ Predicate, Function, Comparator λ“± λ§Žμ€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ„ Predicate.and λ˜λŠ” Function.andThen 같은 λ‹€μ–‘ν•œ λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•œλ‹€.
- JAVA 8 IN ACTION 발췌

μžλ°” 8의 Collection μΈν„°νŽ˜μ΄μŠ€μ— μΆ”κ°€λœ removeIf λ©”μ„œλ“œλ₯Ό 예둜 μƒκ°ν•΄λ³΄μž. 이 λ©”μ„œλ“œλŠ” 주어진 λΆˆλ¦¬μ–Έ ν•¨μˆ˜(predecate; ν”„λ ˆλ””ν‚€νŠΈ)κ°€ trueλ₯Ό λ°˜ν™˜ν•˜λŠ” λͺ¨λ“  μ›μ†Œλ₯Ό μ œκ±°ν•œλ‹€.

default boolean removeIf(predicate<? super E> filter) {
  Objects.requireNonNull(filter);
  boolean result = false;
  for (Iterator<E> it = iterator(); it.hasNext(); ) {
    if (filter.test(it.next())) {
      it.remove();
      result = true;
    }
  return result;
}

μœ„ μ½”λ“œλŠ” λ²”μš©μ μœΌλ‘œ κ΅¬ν˜„λ˜μ—ˆμ§€λ§Œ ν˜„μ‘΄ν•˜λŠ” λͺ¨λ“  Collection κ΅¬ν˜„μ²΄μ™€ 잘 μ–΄μš°λŸ¬μ§€λŠ” 것은 μ•„λ‹ˆλ‹€.

SynchronizedCollection이 λŒ€ν‘œμ μΈ μ˜ˆλ‹€. μ•„νŒŒμΉ˜ 버전은 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ œκ³΅ν•œ 객체둜 락을 κ±°λŠ” κΈ°λŠ₯을 μΆ”κ°€λ‘œ μ œκ³΅ν•œλ‹€. 즉, λͺ¨λ“  λ©”μ„œλ“œμ—μ„œ 주어진 락 객체둜 λ™κΈ°ν™”ν•œ ν›„ λ‚΄λΆ€ μ»¬λ ‰μ…˜ 객체에 κΈ°λŠ₯을 μœ„μž„ν•˜λŠ” 래퍼 ν΄λž˜μŠ€λ‹€. λ”°λΌμ„œ SynchronizedCollection μΈμŠ€ν„΄μŠ€λ₯Ό μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” ν™˜κ²½μ—μ„œ ν•œ μŠ€λ ˆλ“œκ°€ removeIfλ₯Ό ν˜ΈμΆœν•˜λ©΄ concurrentModificationException이 λ°œμƒν•˜κ±°λ‚˜ λ‹€λ₯Έ 예기치 λͺ»ν•œ 결과둜 μ΄μ–΄μ§ˆ 수 μžˆλ‹€.

λ””ν΄νŠΈ λ©”μ„œλ“œ ν˜Έν™˜μ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•œ 방법

μžλ°” ν”Œλž«νΌ 라이브러리 μ—μ„œλ„ 이런 문제λ₯Ό μ˜ˆλ°©ν•˜κΈ° μœ„ν•΄ 일련의 쑰치λ₯Ό μ·¨ν–ˆλ‹€. 예λ₯Ό λ“€μ–΄ κ΅¬ν˜„ν•œ μΈν„°νŽ˜μ΄μŠ€μ˜ λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜κ³ , λ‹€λ₯Έ λ©”μ„œλ“œ μ—μ„œλŠ” λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 ν•„μš”ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ„λ‘ ν–ˆλ‹€.

μ˜ˆμ»¨λŒ€ Collections.synchronizedCollection이 λ°˜ν™˜ν•˜λŠ” package-private 클래슀 듀은 removeIfλ₯Ό μž¬μ •μ˜ν•˜κ³ , 이λ₯Ό ν˜ΈμΆœν•˜λŠ” λ‹€λ₯Έ λ©”μ„œλ“œλ“€μ€ λ””ν΄νŠΈ κ΅¬ν˜„μ„ ν˜ΈμΆœν•˜κΈ° 전에 동기화λ₯Ό ν•˜λ„λ‘ ν–ˆλ‹€.

public class SynchronizedCollection<E> implements Collection<E>, Serializable {
    ...

    /**
    * @since 4.4
    */
    @Override
    public boolean removeIf(final Predicate<? super E> filter) {
        synchronized (lock) {
            return decorated().removeIf(filter);
        }
    }
}

λ””ν΄νŠΈ λ©”μ„œλ“œλŠ” (μ»΄νŒŒμΌμ— μ„±κ³΅ν•˜λ”λΌλ„) κΈ°μ‘΄ κ΅¬ν˜„μ²΄μ— λŸ°νƒ€μž„ 였λ₯˜λ₯Ό μΌμœΌν‚¬ 수 μžˆλ‹€. μžλ°” 8은 μ»¬λ ‰μ…˜ μΈν„°νŽ˜μ΄μŠ€μ— κ½€ λ§Žμ€ λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν–ˆκ³ , κ·Έ κ²°κ³Ό 기쑴에 μ§œμ—¬μ§„ λ§Žμ€ μžλ°” μ½”λ“œκ°€ 영ν–₯을 받은 κ²ƒμœΌλ‘œ μ•Œλ €μ‘Œλ‹€.

λ””ν΄νŠΈ λ©”μ„œλ“œλŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„° λ©”μ„œλ“œλ₯Ό μ œκ±°ν•˜κ±°λ‚˜ κΈ°μ‘΄ λ©”μ„œλ“œμ˜ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό μˆ˜μ •ν•˜λŠ” μš©λ„κ°€ μ•„λ‹˜μ„ λͺ…심해야 ν•œλ‹€. 이런 ν˜•νƒœλ‘œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ³€κ²½ν•˜λ©΄ λ°˜λ“œμ‹œ κΈ°μ‘΄ ν΄λΌμ΄μ–ΈνŠΈλ₯Ό λ§κ°€λœ¨λ¦¬κ²Œ λœλ‹€.

μƒˆλ‘œμš΄ μΈν„°νŽ˜μ΄μŠ€λΌλ©΄ 릴리슀 전에 λ°˜λ“œμ‹œ ν…ŒμŠ€νŠΈλ₯Ό 거쳐야 ν•œλ‹€.

μ°Έκ³ 

https://sejoung.github.io/2018/12/2018-12-17-Design_interfaces_for_posterity/#μ•„μ΄ν…œ-21-μΈν„°νŽ˜μ΄μŠ€λ₯Ό-κ΅¬ν˜„ν•˜λŠ”-μͺ½μ„-생각해-μ„€κ³„ν•˜λΌ

⚠️ **GitHub.com Fallback** ⚠️