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

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

λ§€κ°œλ³€μˆ˜ν™” νƒ€μž…μ„ λ°›λŠ” 정적 μœ ν‹Έλ¦¬ν‹° λ©”μ„œλ“œλŠ” 보톡 μ œλ„€λ¦­μ΄λ‹€. μ˜ˆμ»¨λŒ€ Collections의 'μ•Œκ³ λ¦¬μ¦˜' λ©”μ„œλ“œ(binarySearch, sort λ“±)λŠ” λͺ¨λ‘ μ œλ„€λ¦­μ΄λ‹€.

public static Set union(Set s1, Set s2) {
    Set result = new HashSet(s1);
    result.addAll(s2);
    return result;
}

이 λ©”μ„œλ“œλ₯Ό νƒ€μž… μ•ˆμ „ν•˜κ²Œ λ§Œλ“€μ–΄λ³΄μž

λ©”μ„œλ“œ μ„ μ–Έμ—μ„œ μ„Έ 집합(μž…λ ₯ 2개, λ°˜ν™˜ 1개)의 μ›μ†Œ νƒ€μž…μ„ νƒ€μž… λ§€κ°œλ³€μˆ˜λ‘œ λͺ…μ‹œν•˜κ³ , λ©”μ„œλ“œ μ•ˆμ—μ„œλ„ 이 νƒ€μž… λ§€κ°œλ³€μˆ˜λ§Œ μ‚¬μš©ν•˜κ²Œ μˆ˜μ •ν•˜λ©΄ λœλ‹€.

public static Set<E> union(Set<E> s1, Set<E> s2) {
    Set<E> result = new HashSet(s1);
    result.addAll(s2);
    return result;
}

λ•Œλ•Œλ‘œ λΆˆλ³€ 객체λ₯Ό μ—¬λŸ¬ νƒ€μž…μœΌλ‘œ ν™œμš©ν•  수 있게 λ§Œλ“€μ–΄μ•Ό ν•  λ•Œκ°€ μžˆλ‹€. μ œλ„€λ¦­μ€ λŸ°νƒ€μž„μ— νƒ€μž… 정보가 μ†Œκ±°λ˜λ―€λ‘œ ν•˜λ‚˜μ˜ 객체λ₯Ό μ–΄λ–€ νƒ€μž…μœΌλ‘œλ“  λ§€κ°œλ³€μˆ˜ν™”ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ ν•˜λ €λ©΄ μš”μ²­ν•œ νƒ€μž… λ§€κ°œλ³€μˆ˜μ— 맞게 맀번 κ·Έ 객체의 νƒ€μž…μ„ λ°”κΏ”μ£ΌλŠ” 정적 νŒ©ν„°λ¦¬λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. 이 νŒ¨ν„΄μ„ μ œλ„€λ¦­ μ‹±κΈ€ν„΄ νŒ©ν„°λ¦¬λΌ ν•œλ‹€.

// μ œλ„€λ¦­ μ‹±κΈ€ν„΄ νŒ©ν„°λ¦¬ 예제(Collections.emptySet)
public static final <T> Set<T> emptySet() {
    return (Set<T>) EMPTY_SET;
}

/**
    * @serial include
    */
private static class EmptySet<E>
    extends AbstractSet<E>
    implements Serializable
{
    private static final long serialVersionUID = 1582296315990362920L;

    public Iterator<E> iterator() { return emptyIterator(); }

    public int size() {return 0;}
    public boolean isEmpty() {return true;}

    public boolean contains(Object obj) {return false;}
    public boolean containsAll(Collection<?> c) { return c.isEmpty(); }

    public Object[] toArray() { return new Object[0]; }

    public <T> T[] toArray(T[] a) {
        if (a.length > 0)
            a[0] = null;
        return a;
    }

    // Override default methods in Collection
    @Override
    public void forEach(Consumer<? super E> action) {
        Objects.requireNonNull(action);
    }
    @Override
    public boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        return false;
    }
    @Override
    public Spliterator<E> spliterator() { return Spliterators.emptySpliterator(); }

    // Preserves singleton property
    private Object readResolve() {
        return EMPTY_SET;
    }
}

public class CollectionsEmptySetExample1 {
    public static void main(String[] args) {
        //Create an empty Set
        Set<String> EmptySet = Collections.<String>emptySet();
        System.out.println("Empty Set: "+EmptySet);
    }
}

// result : Empty Set: []

μœ„ μ½”λ“œλŠ” μ œλ„€λ¦­ 싱글턴을 μ‚¬μš©ν•˜λŠ” μ½”λ“œμ΄λ‹€. 이전과 λ™μΌν•˜κ²Œ ν˜•λ³€ν™˜μ„ ν•˜μ§€ μ•Šμ•„λ„ 컴파일 였λ₯˜λ‚˜ κ²½κ³ κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

λ˜λŠ”, 자기 μžμ‹ μ΄ λ“€μ–΄κ°„ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜μ—¬ νƒ€μž… λ§€κ°œλ³€μˆ˜μ˜ ν—ˆμš© λ²”μœ„λ₯Ό ν•œμ •ν•  수 μžˆλ‹€.

λ°”λ‘œ μž¬κ·€μ  νƒ€μž… ν•œμ •μ΄λΌλŠ” κ°œλ…μ΄λ‹€. μž¬κ·€μ  νƒ€μž… ν•œμ •μ€ 주둜 νƒ€μž…μ˜ μžμ—°μ  μˆœμ„œλ₯Ό μ •ν•˜λŠ” Comparable μΈν„°νŽ˜μ΄μŠ€μ™€ ν•¨κ»˜ 쓰인닀.

public interface Comparable<T> {
    int compareTo(T o);
}

Comparable을 κ΅¬ν˜„ν•œ μ›μ†Œμ˜ μ»¬λ ‰μ…˜μ„ μž…λ ₯ λ°›λŠ” λ©”μ„œλ“œλ“€μ€ 주둜 κ·Έ μ›μ†Œλ“€μ„ μ •λ ¬ ν˜Ήμ€ κ²€μƒ‰ν•˜κ±°λ‚˜, μ΅œμ†Ÿκ°’μ΄λ‚˜ μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λŠ” μ‹μœΌλ‘œ μ‚¬μš©λœλ‹€. λ‹€μŒμ€ 이 μ œμ•½μ„ μ½”λ“œλ‘œ ν‘œν˜„ν•œ λͺ¨μŠ΅μ΄λ‹€.

public static <E extends Comparable<E>> E max(Collection<E> c) {
    if (c.isEmpty())
    throw new IllegalArgumentException("μ»¬λ ‰μ…˜μ΄ λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€.");

    E result = null;
    for (E e : c)
    if (result == null || e.compareTo(result) > 0)
        result = Objects.requireNonNull(e);

    return result;
}

νƒ€μž… ν•œμ •μΈ <E extends Comparable<E>>λŠ” "λͺ¨λ“  νƒ€μž… EλŠ” μžμ‹ κ³Ό 비ꡐ할 수 μžˆλ‹€"라고 읽을 수 μžˆλ‹€.

정리

μ œλ„€λ¦­ νƒ€μž…κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ, ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μž…λ ₯ λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜κ°’μ„ λͺ…μ‹œμ μœΌλ‘œ ν˜•λ³€ν™˜ν•΄μ•Ό ν•˜λŠ” λ©”μ„œλ“œλ³΄λ‹€ μ œλ„€λ¦­ λ©”μ„œλ“œκ°€ 더 μ•ˆμ „ν•˜λ©° μ‚¬μš©ν•˜κΈ°λ„ 쉽닀. νƒ€μž…κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ, λ©”μ„œλ“œλ„ ν˜•λ³€ν™˜ 없이 μ‚¬μš©ν•  수 μžˆλŠ” 편이 μ’‹μœΌλ©°, λ§Žμ€ 경우 κ·Έλ ‡κ²Œ ν•˜λ €λ©΄ μ œλ„€λ¦­ λ©”μ„œλ“œκ°€ λ˜μ–΄μ•Ό ν•œλ‹€.

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