为 Java 个 Bean 替换 instanceof
Replacing instanceof for Java Beans
我在使用 JavaBeans 的项目中遇到过一些代码。我发现了一个将这些 bean 写入文件的 Writer
对象。不幸的是,这在写入文件之前使用 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
、BeanAWriter
、BeanBWriter
、BeanCWriter
。我这样做是因为显然为了保持我的 JavaBean 结构,我不能向 Beans 添加方法 write()
。
当我调用 Writer
时,我将我的 bean 作为抽象父级传入 Bean
,因为调用此编写器的函数不关心它正在处理的 bean 类型。
现在我去写我的新类我遇到了一个问题,我覆盖的函数看起来像这样:
public abstract boolean <T extends Bean> writeBean(T bean);
但 BeanAWriter
中的代码如下所示:
public abstract boolean <T extends Bean> writeBean(T bean) {
bean.accessBeanAProperty();
}
此代码无法运行,因为 T 仅被识别为 Bean
而不是 BeanA
,这意味着我的 instanceof
只是被转换为 [=25] =]...
谁能找到解决这个问题的方法/这里出了什么问题?
(我不想扔掉 JavaBeans 也不想听说它是一种反模式,因为更改 bean 可能会使很多代码退化)。
您可以使用基于 class 的泛型而不是基于方法的泛型:
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();
}
}
我在使用 JavaBeans 的项目中遇到过一些代码。我发现了一个将这些 bean 写入文件的 Writer
对象。不幸的是,这在写入文件之前使用 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
、BeanAWriter
、BeanBWriter
、BeanCWriter
。我这样做是因为显然为了保持我的 JavaBean 结构,我不能向 Beans 添加方法 write()
。
当我调用 Writer
时,我将我的 bean 作为抽象父级传入 Bean
,因为调用此编写器的函数不关心它正在处理的 bean 类型。
现在我去写我的新类我遇到了一个问题,我覆盖的函数看起来像这样:
public abstract boolean <T extends Bean> writeBean(T bean);
但 BeanAWriter
中的代码如下所示:
public abstract boolean <T extends Bean> writeBean(T bean) {
bean.accessBeanAProperty();
}
此代码无法运行,因为 T 仅被识别为 Bean
而不是 BeanA
,这意味着我的 instanceof
只是被转换为 [=25] =]...
谁能找到解决这个问题的方法/这里出了什么问题?
(我不想扔掉 JavaBeans 也不想听说它是一种反模式,因为更改 bean 可能会使很多代码退化)。
您可以使用基于 class 的泛型而不是基于方法的泛型:
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();
}
}