设计 Maven 依赖项并避免 Java 中的抽象泄漏的最佳方法?

Best way to design a maven dependency and avoid abstraction leak in Java?

抱歉,我的问题似乎很宽泛。我只是想澄清一些事情。我已经阅读了关于抽象泄漏的线程和其他一些文章。据我了解,抽象泄漏是指 "user" 或开发人员看到函数背后的复杂过程......?就像隐藏汽车的复杂工程或可靠的 TCP 依赖于不可靠的 IP 的秘密一样。但我正在寻找 Java 中的一些 classes,尤其是 List 系列。我观察到的是 List interface, AbstractList, ArrayList, and AbstractArrayList. 我注意到 ArrayList class 中有一些奇怪的东西。 首先我发现了这个

   public E get(int index) {
        rangeCheck(index);
        return elementData(index);
    }

然后这个

    public E get(int index) {
        rangeCheck(index);
        checkForComodification();
        return ArrayList.this.elementData(offset + index);
    }

它们具有相同的函数名称,我认为它们是重载,但它们也采用相同的参数?当我使用 get 时,我怎么知道使用了哪个? 这在 OOP 中合法吗?

下一个笔记,我在列表中找到了这个:

default void sort(Comparator<? super E> c) {
    Object[] a = this.toArray();
    Arrays.sort(a, (Comparator) c);
    ListIterator<E> i = this.listIterator();
    for (Object e : a) {
        i.next();
        i.set((E) e);
    }
}

我想知道他们为什么选择将默认值添加到列表中。我曾经有一个具有默认合同的接口,但有人指出它导致 abstraction/memory 泄漏。 When is it considered to be a good practice to use defaults in an interface?

最后,我在我正在制作的依赖项中制作了一个 "custom" 列表。

class CustomList<T> extends ArrayList<T>{
//sample function: void sortInTheSmartestMagicalWayIdk();
}

这也被指出是一个设计缺陷。 "It's dependent on ArrayList. What if ArrayList becomes obsolete in the future? Then so will be the dependency you are making." 这就是我被告知的。是的,听起来确实不错,那么向列表 Class 添加一些自定义函数的最佳方法是什么?如果我想让项目中的一个实体充当列表,我是否应该 创建一个扩展列表的接口,然后创建该接口的实现并将该实现用作我的 "Custom List"?

问题好像有点不集中

1) 关于两个 get 方法:一个属于 ArrayList,另一个属于 private class SubList。仔细看看缩进,您会立即发现这两种方法甚至不在同一缩进级别。

2) 如果在大多数实现中该方法很可能以完全相同的方式实现 类,您 应该提供默认实现。如果接口过于通用,并且不允许以相当有效的方式实现方法,那么 最好不要 提供默认实现,以便向实现者发出信号接口说明此方法不是免费提供的,需要一定的关注和努力。

3) 在你的 CustomList 中,你是否希望你的界面的用户依赖于保证它永远是一种特殊的 ArrayList?如果是这种情况(极不可能),那么您可以保持原样。如果不是这种情况,您应该去掉 extends ArrayList 并将其替换为 implements List,然后可能在实现中包装一个 ArrayList。如果你后来决定 ArrayList 不是最好的主意,你可以用其他实现替换私有包装成员变量,而不会破坏所有使用你的 API.[= 的人的代码。 19=]