• 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.

  • 相关阅读:
    十六、Redis与MySQL数据双写一致性 —— Canal Demo
    十三、redis分布式锁:缓存续命
    十二、redis分布式锁:单机和多机及案例
    十七、缓存双写一致性之更新策略探讨
    十四、Redis的缓存过期淘汰策略
    自定义类型转换器
    [译]. NET 6 新增API 上
    EF 6 新特性三
    EF 6 新特性二
    [译]. NET 6 新增API 下
  • 原文地址:https://www.cnblogs.com/linkarl/p/4745722.html
Copyright © 2020-2023  润新知