zoukankan      html  css  js  c++  java
  • Effective Java 27 Favor generic methods

    Static utility methods are particularly good candidates for generification.

       

    The type parameter list, which declares the type parameter, goes between the method's modifiers and its return type.

       

    // Generic method

    public static <E> Set<E> union(Set<E> s1, Set<E> s2) {

    Set<E> result = new HashSet<E> (s1);

    result.addAll(s2);

    return result;

    }

       

    To eliminate redundancy of the type declaration of generic constructor write a generic static factory method corresponding to each constructor that you want to use.

    class HashMap<K, V>{

    // Generic static factory method

    public static <K,V> HashMap<K,V> newHashMap() {

    return new HashMap<K,V>();

    }

       

    Public static int main(String[] args){

    // Parameterized type instance creation with static factory

    Map<String, List<String>> anagrams = newHashMap();

    }

    }

       

    Generic singleton factory pattern

    public interface UnaryFunction<T> {

    T apply(T arg);

    }

       

    // Generic singleton factory pattern

    private static UnaryFunction<Object> IDENTITY_FUNCTION =

    new UnaryFunction<Object>() {

    public Object apply(Object arg) { return arg; }

    };

    // IDENTITY_FUNCTION is stateless and its type parameter is

    // unbounded so it's safe to share one instance across all types

    @SuppressWarnings("unchecked")

    public static <T> UnaryFunction<T> identityFunction() {

    return (UnaryFunction<T>)IDENTITY_FUNCTION;

    }

       

    Recursive type bound

    // Using a recursive type bound to express mutual comparability

    public static <T extends Comparable<T>> T max(List<T> list) {...}

       

    // Returns the maximum value in a list - uses recursive type bound

    public static <T extends Comparable<T>> T max(List<T> list) {

    Iterator<T> i = list.iterator();

    T result = i.next();

    while (i.hasNext()) {

    T t = i.next();

    if (t.compareTo(result) > 0)

    result = t;

    }

    return result;

    }

    Summary

    Generic methods, like generic types, are safer and easier to use than methods that require their clients to cast input parameters and return values. Like types, you should make sure that your new methods can be used without casts, which will often mean making them generic. And like types, you should generify your existing methods to make life easier for new users without breaking existing clients (Item 23).

       

    作者:小郝
    出处:http://www.cnblogs.com/haokaibo/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    包和模块的导入问题
    第9.6节 Python使用read函数读取文件内容
    第9.5节 Python的readlines读取文件内容及其参数hint使用分析
    第9.4节 Python中用readline读取二进制文件方式打开文件
    第9.3节 Python的文件行读取:readline
    第9.2节 Python的文件打开函数open详解
    第9.1节 Python的文件打开函数open简介
    第九章 Python文件操作
    第8.34节 《Python类中常用的特殊变量和方法》总结
    第8.33节 Python中__getattr__以及__getattr__与__ getattribute__的关系深入剖析
  • 原文地址:https://www.cnblogs.com/haokaibo/p/favor-generic-methods.html
Copyright © 2011-2022 走看看