替换Java bean的instanceof
我在一个有JavaBeans的项目中遇到了一些代码。我发现了一个替换Java bean的instanceof,java,generics,polymorphism,instanceof,Java,Generics,Polymorphism,Instanceof,我在一个有JavaBeans的项目中遇到了一些代码。我发现了一个Writer对象,它将这些bean写入文件。不幸的是,在写入文件之前,它使用instanceof询问bean的类型,如下所示: if (bean instanceof BeanA) { writer.handleBeanA(bean); } else if (bean instanceof BeanB) { writer.handleBeanB(bean); } else if (bean instanceof Be
Writer
对象,它将这些bean写入文件。不幸的是,在写入文件之前,它使用instanceof
询问bean的类型,如下所示:
if (bean instanceof BeanA) {
writer.handleBeanA(bean);
} else if (bean instanceof BeanB) {
writer.handleBeanB(bean);
} else if (bean instanceof BeanC) {
writer.handleBeanC(bean);
}
这很难看,我想换掉它。因此,我考虑将我的writer拆分为新类writer
,BeanAWriter
,beanwriter
,beanwriter
。我这样做是因为显然为了保持JavaBean结构,我不能向bean中添加方法write()
当我调用Writer
时,我将bean作为抽象父级bean
传入,因为调用此Writer的函数不关心它处理的bean类型
现在我开始编写我的新类,我遇到了一个问题,我覆盖的函数如下所示:
public abstract boolean <T extends Bean> writeBean(T bean);
public abstract boolean <T extends Bean> writeBean(T bean) {
bean.accessBeanAProperty();
}
此代码无法工作,因为T仅被识别为Bean
,而不是BeanA
,这意味着我的实例只被转换为BeanA
有人能找到解决这个问题的办法吗
(我不想扔掉JavaBeans,也不想听说它是一种反模式,因为更改Bean可能会使许多代码倒退)。您可以使用基于类的泛型,而不是基于方法的泛型:
public abstract class BeanWriter<T extends Bean> {
public abstract boolean writeBean(T bean);
}
public class BeanAWriter extends BeanWriter<BeanA> {
public boolean writeBean(BeanA bean) {
bean.accessBeanAProperty();
}
}
公共抽象类BeanWriter{
公共抽象布尔writeBean(tbean);
}
公共类BeanWriter扩展BeanWriter{
公共布尔写bean(beanabean){
accessBeanProperty();
}
}
如何将它们写入文件?那是文本文件吗?json还是什么?编写器将从bean中获取特定的(不同的类型)字段,并从中构造字节表示,然后将其保存为文本文件。为什么编写器需要这样向下转换?它需要访问子类字段?啊,你不需要所有字段。因为bean根据定义是可序列化的,所以您可以序列化它们,而无需携带类型。但它将存储所有字段,而不是序列化字段。在将它们保存到文件中之前,会对它们进行操作。但是,假设它们是给定的,例如列表
。现在,他们正在为每个bean创建一个writer,他们仍然需要使用instanceof
来确定要实例化哪个writer。要使用List
实现这一点,您必须有某种注册表来映射Class@Rossiar这与instanceof
的问题完全相同。现在,您需要为每个Bean创建一个编写器。如果你将类映射到编写器,那么你也在做同样的事情。是的,理想情况下,我会声明一个接口write()
,并在Bean
的基础上实现。还是你有别的想法?理想远非我所能处理的。。。