我们在办公室中讨论,无法理解哪种方法更好
我有一个类(SomeClass),其中有一些方法可以接收Serializable对象。签名如下:
public void someMethod(Serializable serializableObject){
...
}
我需要从另一个类调用这个方法,但是我应该提供一些列表作为实际参数。有两种不同的方法
1. 可序列化
private SomeClass someClass;
public void doSomething() {
List<String> al = new ArrayList<String>();
al.add("text");
someClass.someMethod((Serializable)al);
}
2. ArrayList
private SomeClass someClass;
public void doSomething() {
ArrayList<String> al = new ArrayList<String>();
al.add("text");
someClass.someMethod(al);
}
第一个例子的好处在于它遵循了Java最佳实践,即:对于引用类型,使用接口而不是具体实现,并且任何程序员在阅读该源代码时都将理解我们不需要特殊的ArrayList行为。我们只需要它的可序列化行为,通过将其强制转换为Serializable接口来添加这种行为。程序员可以简单地将此列表的当前实现更改为其他可序列化实现(例如LinkedList),而不会对此元素产生任何副作用,因为我们使用List作为其引用类型。
第二个例子的好处在于,我们将ArrayList作为既有List行为又有Serializable行为的类进行引用。因此,如果有人查看此代码并尝试将ArrayList更改为List,则会收到编译时错误,这将减少程序员理解正在发生的事情所需的时间。
更新:我们无法更改someMethod签名。它来自第三方公司,并且我们不仅将其用于可序列化列表,还将其用于字符串、整数和其他一些可序列化对象。
SomeClass.someMethod()
的签名,因为该方法由第三方库提供,并且它应该接受所有类型的可序列化对象,而不仅仅是可序列化列表。我们的问题只是:在我们必须将 List 的实例传递给此类方法时,哪种方法更好。 - agav