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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    spring aop实现过程之三Spring AOP中Aspect编织的实现
    spring aop实现过程之一代理对象的生成
    数据库常用面试题(SQL Server) (转载)
    回溯法解八后问题
    masmplus增加调试工具
    c++ new关键字 详解
    EMU8086 编译器使用简介
    汇编操作显存
    回溯法简介
    汇编链接时 错误:unresolved external symbol _WinMainCRTStartup
  • 原文地址:https://www.cnblogs.com/haokaibo/p/favor-generic-methods.html
Copyright © 2011-2022 走看看