我有一个方法,它将Object作为参数。
public String toStr(Object o) {}
有两种工厂方法可以生成两个不同的实例。
A a = FactoryA.generate()
B b = FactoryB.generate()
在我的代码中,
Object y;
If (x) {
y = FactoryA.generate()
} else {
y = FactoryB.generate()
}
toStr(y)
有没有一种方法可以为a和B定义一个公共类型,这样我就可以将该公共类型传递给toStr(),而不是使用Object,因为我想要一个更具体的类型而不是Object来进行类型检查。如果类A和B有共同的方法或字段,我会创建一个超类C或接口C,这样我就可以用C替换Object。但A和B没有共同的方法和字段。在这种情况下,定义a和B的通用类型的最佳方法是什么?空接口或空抽象类是最好的方法吗?
如何在Java中定义公共类型而不定义超类或接口?
在Java中,定义类型的两种机制是接口和类(特别是抽象类)。因为Java只允许一个类扩展另一个类,所以为此目的使用抽象类不会很好。然而,类可以实现任意数量的接口,并且空接口仍然定义类型。如果不了解更多关于用例的信息,就无法判断是否真的需要定义一个类型。
如果你的意图是让你的代码向某种外部框架发出信号,表明应该进行某种特殊的处理,那么该语言必须提供的两种机制是:
- 标记接口
- 注释
这两种方法各有利弊。标记接口的优点是,它们实际上定义了一个类型,并且可以编写API来将参数限制为该类型。注释允许在使用地点指定元数据或配置信息。JavaEE框架在客户端代码中广泛使用注释。Java EE中的这些注释可以而且通常提供自定义的配置元数据。
乔舒亚·布洛赫(Joshua Bloch)在《高效Java》第二版中简要介绍了标记接口与注释的优点。
考虑使用如下接口:
interface I {
default String toStr() {
//implement
}
//OR : String toStr();
}
class A implements I{}
class B implements I{}
使用它:
I i;
if (x) {
i = FactoryA.generate(); //construct A
} else {
i = FactoryB.generate(); //construct B
}
i.toStr();