TreeList 不存在,所以我们以PersistentList 为例。
假设您有一个要保存到数据库的@Entity:
public class MyMagicEntity {
@OneToMany
List<MyChildEntity> children;
public void setChildren(final List<MyChildEntity> children) {
this.children = children;
}
}
现在,当您创建 MyMagicEntity 时,您会执行类似的操作
final MyMagicEntity mme = new MyMagicEntity();
final List<MyChildEntity> children = new ArrayList<>();
children.add(new MyChildEntity("one"));
children.add(new MyChildEntity("two"));
children.add(new MyChildEntity("three"));
mme.setChildren(children);
//save to DB
因此,您创建了一个 ArrayList,并将其传递给您的 MyMagicEntity,并将其分配给 List - 只要它是 List,它并不关心底层实现。
现在,稍后你会这样做:
final MyMagicEntity mme = //load from DB
final List<Children> children = mme.getChildren();
那么,children 是什么?好吧,如果我们使用 JPA 和 Hibernate,它实际上是 PersistentList,而不是 ArrayList。
当我们访问children 的成员时,Hibernate 会从数据库中提取它们。这个List 仍然是List - 你的程序不需要知道这些。
不使用List 接口你能做到这一点吗?不!因为:
- 您无法创建
PersistentList
- Hibernate 无法创建
ArrayList
虽然这是一个极端的例子,List 的基本行为完全不同,但这适用于各种其他情况。
例如:
-
ArrayList 和 LinkedList 具有不同的性能特征,您可能需要切换
- Guava 有一个
ImmutableList,您可能想使用它
-
Collections.unmodifyableList 和 implements List,你可能想用它
- 您可以有一个由文件支持的
List
基本思想是List 定义了任何列表必须能够做什么,而不是如何完成。