在Java中设计maven依赖项并避免抽象泄漏的最佳方法?
对不起,我的问题似乎很宽泛。我只是想澄清一些事情。我读过关于抽象泄漏的线程和其他一些文章。据我所知,抽象泄漏是指“用户”或开发人员看到函数背后的复杂过程。。。?比如隐藏复杂的汽车工程,或者隐藏可靠的TCP依赖于不可靠的IP的秘密。但是我在研究Java中的一些类,特别是List系列。我观察到的是在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
列表接口、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();
}