类型推断
Type interface
http://ifeve.com/static-factory-methods-vs-traditional-constructors/
最后一个优点是静态工厂是实例化参数类很简洁。你曾经见过像这样的代码吗?
你在代码的同一行重复相同的参数两次!如果右边的赋值可以从左边被推断出来,那将是很优雅的做法。使用静态方法就可以。下面的代码取自 Guava’s Maps 类:
所以现在我们的客户端代码变成如下:
总的来讲,静态工厂方法提供了许多优点,当你在使用时唯一的不足之处实际上也不会是一个问题。所以,评估一下你的类是否更适合静态工厂,拒绝急切的自动提供公共的构造器。
Type interface
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
public class Test{
Map<String ,List<String>> map1 = new HashMap<String ,List<String>>();
List<String> list1 = new ArrayList<String>();
Map<String ,List<String>> map2 = Maps.newHashMap();
List<String> list2 = Lists.newArrayList();
}
http://ifeve.com/static-factory-methods-vs-traditional-constructors/
最后一个优点是静态工厂是实例化参数类很简洁。你曾经见过像这样的代码吗?
Map<String, List<String>> map = new HashMap<String, List<String>>();
你在代码的同一行重复相同的参数两次!如果右边的赋值可以从左边被推断出来,那将是很优雅的做法。使用静态方法就可以。下面的代码取自 Guava’s Maps 类:
public static <K, V> HashMap<K, V> newHashMap() {
return new HashMap<K, V>();
}
所以现在我们的客户端代码变成如下:
Map<String, List<String>> map = Maps.newHashMap();
相当的优雅,对吗?这样的能力被成为类型推断(Type interface)。值得一提的是Java7通过使用方括号运算符(diamond operator)引入了类型推断。所以,如果你使用Java7你可以前面的例子如:
Map<String, List<String>> map = new HashMap<>();
静态工厂的主要缺点是类中没有public或者protected的构造器无法被继承。但事实上,在某种情况下这个一件好事,因为鼓励开发者优先使用组合而不是继承(favor composition over inheritance)。
总的来讲,静态工厂方法提供了许多优点,当你在使用时唯一的不足之处实际上也不会是一个问题。所以,评估一下你的类是否更适合静态工厂,拒绝急切的自动提供公共的构造器。