item 30 JungHyunLyoo - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

μ œλ„€λ¦­ λ©”μ„œλ“œ

ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ, λ©”μ„œλ“œλ„ μ œλ„€λ¦­μœΌλ‘œ λ§Œλ“€ 수 μžˆλ‹€.

νƒ€μž… λ§€κ°œλ³€μˆ˜μ˜ λͺ…λͺ… κ·œμΉ™μ€ μ œλ„€λ¦­ λ©”μ„œλ“œλ‚˜ μ œλ„€λ¦­ νƒ€μž…μ΄λ‚˜ λ˜‘κ°™λ‹€.(item 29)

raw type을 μ‚¬μš©ν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•œλ‹€(Set,List)

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

μœ„ λ©”μ„œλ“œλŠ” 집합 3개(μž…λ ₯ 2개, λ°˜ν™˜1개)의 νƒ€μž…μ΄ λͺ¨λ‘ κ°™μ•„μ•Ό ν•œλ‹€.

이λ₯Ό ν•œμ •μ  μ™€μΌλ“œμΉ΄λ“œ νƒ€μž…(item 31)을 μ‚¬μš©ν•˜μ—¬ 더 μœ μ—°ν•˜κ²Œ κ°œμ„ ν•  수 μžˆλ‹€.

μ œλ„€λ¦­ μ‹±κΈ€ν„΄ νŒ©ν„°λ¦¬ νŒ¨ν„΄

λ•Œλ•Œλ‘œ λΆˆλ³€ 객체(Immutable Object)λ₯Ό μ—¬λŸ¬ νƒ€μž…μœΌλ‘œ ν™œμš©ν•  수 있게 λ§Œλ“€μ–΄μ•Ό ν•  λ•Œκ°€ μžˆλ‹€.

μ΄λ ‡κ²Œ ν•˜λ €λ©΄, μš”μ²­ν•œ νƒ€μž… λ§€κ°œλ³€μˆ˜μ— 맞게 맀번 κ·Έ 객체의 νƒ€μž…μ„ λ°”κΏ”μ£ΌλŠ” 정적 νŒ©ν„°λ¦¬λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

이 νŒ¨ν„΄μ„ μ œλ„€λ¦­ μ‹±κΈ€ν„΄ νŒ©ν„°λ¦¬λΌ ν•œλ‹€.

μ œλ„€λ¦­ μ‹±κΈ€ν„΄ νŒ©ν„°λ¦¬ νŒ¨ν„΄μ˜ 예제λ₯Ό μ‚΄νŽ΄λ³΄μž

import java.util.function.UnaryOperator;

public class GenericSingletonFactory {
    private static UnaryOperator<Object> IDENTITY_FN = (t) -> t;

    @SuppressWarnings("unchecked")
    public static <T> UnaryOperator<T> identityFunction() {
        return (UnaryOperator<T>) IDENTITY_FN;
    }

    public static void main(String[] args) {
        String[] strings = { "μ‚Όλ² ", "λŒ€λ§ˆ", "λ‚˜μΌλ‘ " };
        UnaryOperator<String> sameString = identityFunction();
        for (String s : strings)
            System.out.println(sameString.apply(s));

        Number[] numbers = { 1, 2.0, 3L };
        UnaryOperator<Number> sameNumber = identityFunction();
        for (Number n : numbers)
            System.out.println(sameNumber.apply(n));
    }
}

μž¬κ·€μ  νƒ€μž… ν•œμ •

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

νƒ€μž…μ˜ μžμ—°μ  μˆœμ„œλ₯Ό μ •ν•˜λŠ” Comparable μΈν„°νŽ˜μ΄μŠ€(item 14)와 ν•¨κ»˜ μ“°μ΄λŠ” κ°œλ…μ΄λ‹€.

Comparable을 κ΅¬ν˜„ν•œ μ›μ†Œμ˜ μ»¬λ ‰μ…˜μ„ μž…λ ₯λ°›λŠ” λ©”μ„œλ“œλ“€μ€ 주둜 κ·Έ μ›μ†Œλ“€μ„ μ •λ ¬ ν˜Ήμ€ κ²€μƒ‰ν•˜κ±°λ‚˜,

μ΅œμ†Ÿκ°’μ΄λ‚˜ μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λŠ” μ‹μœΌλ‘œ μ‚¬μš©λœλ‹€.

import java.util.*;

// μž¬κ·€μ  νƒ€μž… ν•œμ •μ„ μ΄μš©ν•΄ μƒν˜Έ 비ꡐ할 수 μžˆμŒμ„ ν‘œν˜„ (179μͺ½)
public class RecursiveTypeBound {
    // μ½”λ“œ 30-7 μ»¬λ ‰μ…˜μ—μ„œ μ΅œλŒ“κ°’μ„ λ°˜ν™˜ν•œλ‹€. - μž¬κ·€μ  νƒ€μž… ν•œμ • μ‚¬μš© (179μͺ½)
    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;
    }

    public static void main(String[] args) {
        List<String> argList = Arrays.asList(args);
        System.out.println(max(argList));
    }
}

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

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