我今天的问题不是解决问题的问题,而是最佳实践理论问题。我正在熟悉 Joda-Time,并在用户指南 ( http://joda-time.sourceforge.net/userguide.html#Interface_usage ) 中阅读了此内容:
使用 Collections 接口(例如 List 或 Map)时,您通常会将变量保存为 List 或 Map 的类型,仅在创建对象时引用具体类。
List list = new ArrayList(); Map map = new HashMap();
这让我觉得很奇怪。在我的编程中,我总是为我的变量保留具体的类,除非我正在编写某种 API。有没有人有任何有用的材料来解释为什么优先为您的变量类型保留通用/抽象类而不是具体类的原因?
为了说明,我编写了一个简单的方法,每当我需要一个对象列表作为用逗号分隔的字符串时,我都会使用它:
public static <T> String CSV(Collection<T> list) {
boolean first = true;
StringBuilder sb = new StringBuilder();
for(Object e : list) {
if(first)
first = false;
else
sb.append(", ");
sb.append(e.toString());
}
return sb.toString();
}
当然,这里你必须使用 Collection,这样你就可以传入任何你想要的东西,Object[]、LinkedList 等。
但是让我们在别处说我正在存储一组字符串,并且我希望它是一个 LinkedHashSet,我会像这样创建变量:
LinkedHashSet<String> set = new LinkedHashSet<String>();
或者
LinkedHashSet<String> set = new LinkedHashSet<>();
(因为 Java 7 的变化)
但根据 Joda-Time 的用户指南,我应该这样做:
Set<String> set = new LinkedHashSet<String>();
?
我只是没有看到优势。有人有有用的输入/阅读材料吗?
谢谢!