作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
为了能够代入特定的实现,众所周知的写法
List<AnyType> myList = new ArrayList<AnyType>();
代替
ArrayList<AnyType> myList = new ArrayList<AnyType>();
这很容易理解,这样您就可以轻松地将实现从 ArrayList 更改为 LinkedList 或任何其他类型的 List。
好吧...这一切都很好,但由于我无法直接实例化“列表”,因此我需要输入
public List<AnyType> getSpecificList()
{
return new ArrayList<AnyType>();
}
这使得之前的模式变得毫无意义。如果我现在想用 LinkedList 而不是 ArrayList 替换实现怎么办?需要在两个位置上更改它。
有没有可能有这样的东西(我知道语法绝对不正确)?
public class MyClass<T>
{
Type myListImplementation = ArrayList;
List<T> myList = new myListImplementation<T>();
public List<T> getSpecificList()
{
return new myListImplementation<T>();
}
}
这样我就可以简单地将单词“ArrayList”更改为“LinkedList”,一切都很好。我知道这两个列表可能有不同的构造函数,这不会“按原样”工作。而且我真的不想添加第二个类型参数来指定正在使用的列表实现。
有什么干净的机制可以解决这个问题吗?^
在此先致谢并致以最诚挚的问候氛围营造
最佳答案
为什么不使用某种类型的 factory pattern而不是直接实例化特定的列表实现。然后您只需在工厂方法内的一个地方更改列表实现。
例如,您开始于:
List<T> createList() {
return new ArrayList<T>();
}
List<T> myList1 = createList();
List<T> myList2 = createList();
稍后,如果您决定需要一个链表,您只需更改 createList() 的实现,其余代码保持不变。
List<T> createList() {
return new LinkedList<T>();
}
关于java - 泛型:类型为变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1539038/
我是一名优秀的程序员,十分优秀!