zoukankan      html  css  js  c++  java
  • Effective Java 英文 第二版 读书笔记 Item 1: Consider static factory methods instead of constructors

    最近每天上班下班有点时间看下 Effective Java。

    我一般看看原文,在看看示例代码,再想想原文的意思。

    我英文也不是很好,所以决定中文英文随便用.

    代码部分主要是用sublime敲的,可能存在错误。

    Creating and destroying objects

    Item 1: Consider static factory methods instead of constructors 

     

    Advantage of static factory methods

    1.Unlike constructors. They have names.

     

    2.They are not required to create a new object each time they’re invoked.

     

    3.They can return an object of any subtype of their return type.

     

    4.They reduce the verbosity of creating parameterized type instances.

      

     

    1.

    public static Boolean valueOf(boolean b){
        return b?Boolean.TRUE:Boolean.FALSE;
    }

    3.

    A service provider framework.

    a service interface,which providers implement;

    a provider registration API,which the system uses to register implementations,giving clients access to them;

    a service access API,which clients use to obtain an instance of the service.

    optional component a service provider interface,which providers implement to create instances of their service implementation.

    In the case of JDBC . Connection plays the part of the service interface,DriverManager.registerDriver is the provider registration API,DriverManager.getConnection is the service access API,and Driver is the service provider interface.

    //Service provider framework sketch
    
    //Service interface
    public interface Service{
        //Service-specific methods go here
    }
    
    //Service provider interface
    public interface Provider{
        Service newService();
    }
    
    // Noinstantiable class for service registration and access 
    public class Services{
        private Services(){} // Prevents instantiation 
    
        //Maps service names to services 
        private static final Map<String,Provider> providers = new ConcurrentHashMap<String,Provider>();
        
        public static final String DEFAUL_provider_name="<def>"//Provider registration API
        public static void registerDefaultProvider(Provider p){
            registerProvider(DEFAUL_provider_name,p);
        }
        public static void registerProvider(String name,Provider p){
            providers.put(name,p);
        }
    
        //Serivce access API
        public static Service newInstance(){
            return newInstance(DEFAUL_provider_name);
        }
        public static Service newInstance(String name){
            Provider p=providers.get(name);
            if (p==null {
                throw new IllegalArgumentException(
                    "No provider registered with name: "+name);
                return p.newService();
                
            }
    
        }
    
    }

    4.

        //the general way to create a instance,clearly the right part of The assignment is repeated
        Map<String,List<String>> m=new HashMap<String,List<String>>();
    
        //suppose that HashMap providerd this static factory:
        public static <K,V> HashMap<K,V> newInstance(){
            return new HashMap<K,V>();
        }
    
        //Then you could replace the wordy declaration above with this succinct alternative:
        Map<String,List<String>> m=HashMap.newInstance();

    Disadvantage of static factory methods

    classes without public or protected constructors cannot be subclassed.

    they are not readily distinguishable from other static methods.

    ValueOf--Returns an instance that has,loosely speaking,the same value as its parameters.Such static factories are effectively type-conversion methods.

    Of--A concise alternative to valueOf,popularized by EnumSet.

    getInstance--Returns an instance that is described by the parameters but cannot be said to have the same value.In the case of a singleton,getInstance takes no parameters and returns the sole instance

    newInstance--Like getInstance,except that newInstance guarantees that each instance returned is distinct from all others.

    getType--Like getInstance,but used when the factory method is in a different class.Type indicates the type of object returned by the factory method.

    newType--Like newInstance,but used when the factory method is in a different class.Type indicates the type of object returned by the factory method.

    In summary,static factory methods and public constructors both have their uses,and it pays to understand their relative merits.Often static factories are preferable ,so avoid the reflex to provide public constructors without first considering static factories.

  • 相关阅读:
    LeetCode 977 有序数组的平方
    LeetCode 24 两两交换链表中的节点
    LeetCode 416 分割等和子集
    LeetCode 142 环形链表II
    LeetCode 106 从中序与后序遍历序列构造二叉树
    LeetCode 637 二叉树的层平均值
    LeetCode 117 填充每个节点的下一个右侧节点
    LeetCode 75 颜色分类
    redhat 7.4 挂载ntfs格式的u盘并且使用
    redhat 查看CPU frequency scaling(CPU频率缩放)
  • 原文地址:https://www.cnblogs.com/linkarl/p/4745722.html
Copyright © 2011-2022 走看看