gpt4 book ai didi

java - 在 Java 中,变量应该总是用接口(interface)声明吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:27:34 27 4
gpt4 key购买 nike

人们经常看到这样的建议,即变量应该用某个接口(interface)声明,而不是实现类。例如:

List<Integer> list = new ArrayList<>();

但是,假设我将此列表用于一种算法,该算法确实依赖于 ArrayList 的 O(1) 随机访问(例如 Fisher-Yates 改组)。在那种情况下,ArrayList 对我来说代表的关键抽象是它类似数组的性质,而不仅仅是它的列表性质。换句话说,如果有人出现并将 list 更改为 LinkedList,这将是有问题的,即使代码可以编译。在这种情况下,是否可以让声明使用实现类型?例如:

ArrayList<Integer> list = new ArrayList<>(); 

最佳答案

强调 Oliver Charlesworth 在评论中所说的:此信息是否公开是最关键的区别。

从问题的写作方式来看,您似乎在谈论一个字段(而不是方法参数或返回值)。根据定义,私有(private)字段是一个实现细节,您可以使其任意具体。因此,将其声明为 ArrayList 是可行的 - 尽管严格来说,这并不相关。换句话说:你说

if someone ... changed list to a LinkedList, this would be problematic,...

可以更改声明的人

private List<T> list = new ArrayList<T>();

private List<T> list = new LinkedList<T>();

也可以改变声明

private ArrayList<T> list = new ArrayList<T>();

private LinkedList<T> list = new LinkedList<T>();

防止这种情况的唯一实用方法是将此(重要的)实现细节添加为注释,例如

/**
* The list that stores ... whatever.
*
* This list should have a complexity of O(1) for random access,
* because ...
*/
private final List<T> list = new ArrayList<T>();

(这也可以通过将列表内部传递给期望它是 RandomAccess 的方法来强制执行。这是由 AlexR 提出的,但指的是 public 方法. 对于 private 方法,如果 意图 和要求 原因,即使这也不会阻止某人更改方法签名RandomAccess 未记录)。

关于java - 在 Java 中,变量应该总是用接口(interface)声明吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27215213/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com