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

在Java中设计maven依赖项并避免抽象泄漏的最佳方法?,java,maven,oop,maven-3,Java,Maven,Oop,Maven 3,对不起,我的问题似乎很宽泛。我只是想澄清一些事情。我读过关于抽象泄漏的线程和其他一些文章。据我所知,抽象泄漏是指“用户”或开发人员看到函数背后的复杂过程。。。?比如隐藏复杂的汽车工程,或者隐藏可靠的TCP依赖于不可靠的IP的秘密。但是我在研究Java中的一些类,特别是List系列。我观察到的是列表接口、AbstractList、ArrayList和AbstractArrayList。我注意到ArrayList类中有一些奇怪的东西。 首先我找到了这个 public E get(int ind

对不起,我的问题似乎很宽泛。我只是想澄清一些事情。我读过关于抽象泄漏的线程和其他一些文章。据我所知,抽象泄漏是指“用户”或开发人员看到函数背后的复杂过程。。。?比如隐藏复杂的汽车工程,或者隐藏可靠的TCP依赖于不可靠的IP的秘密。但是我在研究Java中的一些类,特别是List系列。我观察到的是
列表接口、AbstractList、ArrayList和AbstractArrayList。
我注意到ArrayList类中有一些奇怪的东西。 首先我找到了这个

   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);
    }
}

这也是一个设计缺陷。“它依赖于ArrayList。如果ArrayList在将来变得过时了怎么办?那么你所建立的依赖关系也将如此。”这是我被告知的。是的,这听起来不错,那么向List类添加一些自定义函数的最佳方法是什么呢?如果我想让项目中的一个实体充当列表,我是否应该创建一个扩展列表的接口,然后创建该接口的实现,并将该实现用作我的“自定义列表”?

这个问题似乎有点没有重点

1)关于两个
get
方法:一个属于
ArrayList
另一个属于
私有类子列表
。仔细观察缩进,您会立即发现这两种方法甚至不在同一缩进级别上

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


3)在您的
自定义列表中,您是否希望您的界面用户依赖于保证它始终是一种特殊的
数组列表
?如果是这种情况(可能性很小),那么您可以保持原样。如果不是这种情况,您应该去掉
extensedarraylist
,用
implements List
替换它,然后可能在实现内部包装一个
ArrayList
。如果您后来认为
ArrayList
不是最好的主意,您可以用其他实现替换私有包装的成员变量,而不会破坏所有使用API的人的代码。

拥有两个具有相同签名的函数是非法的。你看到了哪一个ArrayList?公共接口和已发布接口之间存在差异。ArrayList是JDK已发布接口的一部分,我希望oracle在更改它之前会考虑多次。使用它并从中扩展类是完全可以的。看看这个:我正在使用IntelliJ,所以我只需单击ArrayList,它就会打开ArrayList类。我上面展示的get函数在同一个类中。我想上传它的图片,但这里的图片就像葡萄干到面包一样。是的,我为这个没有重点的问题道歉。我的OOP知识还缺乏一些经验。谢谢你的回答。啊,我感觉没有注意到第二个进入子列表。这个问题怎么样。***什么时候应用抽象泄漏?***我还是有点困惑。是否应该像System.out.println将写入函数隐藏得如此之深,以至于用户认为prinln只是在打印字符串?它不必使用“deep”或用户“思考”的内容。在
System.out
的情况下,用户看到它是一个
PrintStream
,它可以做的不仅仅是
println
CustomList extends-ArrayList
的问题在于,类的用户可以在其上调用方法
trimToSize()
。如果以后决定将实现从
ArrayList
更改为
Set
,则必须在界面中保留无意义的方法
trimToSize()
,或者中断用户代码。这两种变体都不好:这是因为
trimToSize()
(以及所有其他内部组件)已经泄漏。好,好。谢谢你澄清这一点。
class CustomList<T> extends ArrayList<T>{
//sample function: void sortInTheSmartestMagicalWayIdk();
}