博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 编码规范:(一)考虑用静态工厂方法代替构造器
阅读量:6246 次
发布时间:2019-06-22

本文共 2732 字,大约阅读时间需要 9 分钟。

对于类而言,为了让客户端获取它自身的一个实例,最常用的方法就是提供一个公有的构造器。类也可以提供一个公有的静态工厂方法,它只是一个返回类的实例的静态方法。下面是一个来自Boolean的简单示例。

[java]
  1. public static Boolean valueOf(boolean b) {  
  2.     return b ? Boolean.TRUE : Boolean.False;  
  3. }  

静态工厂方法与构造器不同的第一大优势在于,它们有名称。

静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新对象。

静态工厂方法与构造器不同的第三大优势在于,它们可以返回原返回类型的任何子类型的对象。

静态工厂方法的第四大优势在于,在创建参数化类型实例的时候,它们使代码变得更加简洁。

静态工厂方法的主要缺点在于,类如果不含有公有的或受保护的构造器,就不能被子类化。

静态工厂方法的第二个缺点在于,它们与去他的静态方法实际上没有任何区别。

服务提供者框架:

[java]
  1. // Service provider framework sketch - Service interface   
  2.   
  3. public interface Service {  
  4.     // Service-specific methods go here  
  5. }  
[java]
  1. // Service provider framework sketch - Service provider interface   
  2.   
  3. public interface Provider {  
  4.     Service newService();  
  5. }  
[java]
  1. // Service provider framework sketch  
  2.   
  3. // Noninstantiable class for service registration and access   
  4.   
  5. import java.util.*;  
  6. import java.util.concurrent.*;  
  7.   
  8. public class Services {  
  9.     private Services() { }  // Prevents instantiation (Item 4)  
  10.   
  11.     // Maps service names to services  
  12.     private static final Map<String, Provider> providers =  
  13.         new ConcurrentHashMap<String, Provider>();  
  14.     public static final String DEFAULT_PROVIDER_NAME = "<def>";  
  15.   
  16.     // Provider registration API  
  17.     public static void registerDefaultProvider(Provider p) {  
  18.         registerProvider(DEFAULT_PROVIDER_NAME, p);  
  19.     }  
  20.     public static void registerProvider(String name, Provider p){  
  21.         providers.put(name, p);  
  22.     }  
  23.   
  24.     // Service access API  
  25.     public static Service newInstance() {  
  26.         return newInstance(DEFAULT_PROVIDER_NAME);  
  27.     }  
  28.     public static Service newInstance(String name) {  
  29.         Provider p = providers.get(name);  
  30.         if (p == null)  
  31.             throw new IllegalArgumentException(  
  32.                 "No provider registered with name: " + name);  
  33.         return p.newService();  
  34.     }  
  35. }  
[java]
  1. // Simple test program for service provider framework  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         // Providers would execute these lines  
  6.         Services.registerDefaultProvider(DEFAULT_PROVIDER);  
  7.         Services.registerProvider("comp",  COMP_PROVIDER);  
  8.         Services.registerProvider("armed", ARMED_PROVIDER);  
  9.   
  10.         // Clients would execute these lines  
  11.         Service s1 = Services.newInstance();  
  12.         Service s2 = Services.newInstance("comp");  
  13.         Service s3 = Services.newInstance("armed");  
  14.         System.out.printf("%s, %s, %s%n", s1, s2, s3);  
  15.     }  
  16.   
  17.     private static Provider DEFAULT_PROVIDER = new Provider() {  
  18.         public Service newService() {  
  19.             return new Service() {  
  20.                 @Override public String toString() {  
  21.                     return "Default service";  
  22.                 }  
  23.             };  
  24.         }  
  25.     };  
  26.   
  27.     private static Provider COMP_PROVIDER = new Provider() {  
  28.         public Service newService() {  
  29.             return new Service() {  
  30.                 @Override public String toString() {  
  31.                     return "Complementary service";  
  32.                 }  
  33.             };  
  34.         }  
  35.     };  
  36.   
  37.     private static Provider ARMED_PROVIDER = new Provider() {  
  38.         public Service newService() {  
  39.             return new Service() {  
  40.                 @Override public String toString() {  
  41.                     return "Armed service";  
  42.                 }  
  43.             };  
  44.         }  
  45.     };  

转载地址:http://ghoia.baihongyu.com/

你可能感兴趣的文章
Python--分析微信好友是否被删除
查看>>
MYSQL一些字符串的处理,如拼接,截取等,便于用在同一字段中多个值的处理...
查看>>
网络工程师
查看>>
在C#下的SQL模糊查询语句 (Visual Studio)
查看>>
第三章 广域通信网
查看>>
xhtml+css基础知识2
查看>>
我的友情链接
查看>>
Java环境变量配置
查看>>
Magent搭建Memcached集群
查看>>
SQL Server远程备份报错:Operating system error 1326
查看>>
域名转移和域名DNS修改
查看>>
域名查找及错误检查
查看>>
JavaScript 字符串处理详解
查看>>
Linux 查看系统硬件信息(实例详解)
查看>>
Linux系统开发8 线程
查看>>
我的友情链接
查看>>
linux安装过程对硬盘进行分区
查看>>
linux安装eclipse集成开发环境
查看>>
像少年啦飞驰
查看>>
Advanced+Apple+Debugging(1)
查看>>