我们在代码库中有一个处理程序类的层次结构,它们实现了一种责任链原则。有一个抽象父类,它由几个子类扩展,这些子类也在其构造函数中接收抽象
public abstract class AbstractHandler {
public AbstractHandler(final AbstractHandler next, final PropertyName propertyName) {
this.next = next;
this.propertyName = propertyName;
}
...
public class OneConcreteChildHandler extends AbstractHandler {
public OneConcreteChildHandler(final AbstractHandler next) {
super(next, PropertyName.OneConcreteChild);
}
...
我们现在需要将具体子类之一的实例注入到新实现的服务类中,我们应该用XML来配置它。我们可以为抽象父类配置一个抽象bean,但这个bean似乎不被允许用作具体子bean的构造函数-arg
<bean id="abstractHandler" abstract="true" class="...AbstractHandler" />
<bean id="oneConcreteChildHandler" class="...OneConcreteChildHandler" parent="abstractHandler">
<constructor-arg ref="abstractHandler"/> //"abstract bean can not be used here"
</bean>
<bean id="someService" class="...SomeService">
<constructor-arg ref="oneConcreteChildHandler"/>
...
有什么办法可以克服这一点吗?处理程序类层次结构是遗留代码,我们现在无法修改它们的源代码。
这里的主要问题是您试图注入一个抽象bean。你不应该这么做。这个AbstractHandler
应该只用于映射子bean中的父级
。尽管如此,它并不是你真正想要/需要的。您不会在此构造函数中传递抽象对象,而是传递另一个子类的对象。您的链必须有一个结束点,其中构造函数的参数next
将为null,如下所示:
<bean id="abstractHandler" abstract="true" class="...AbstractHandler" />
<bean id="oneConcreteChildHandler" class="...OneConcreteChildHandler" parent="abstractHandler">
<constructor-arg ref="twoConcreteChildHandler"/>
</bean>
<bean id="twoConcreteChildHandler" class=".." parent="abstractHandler">
<constructor-arg name="next">
<null />
</constructor-arg>
</bean>
<bean id="someService" class="...SomeService">
<constructor-arg ref="oneConcreteChildHandler"/>
...
问题内容: 我有这样的事情: 如您所见,超类的init方法是抽象的,并在创建对象后由构造函数自动调用。 当我需要创建这种类型的对象且其结构不会及时更改时,我很好奇我是否会遇到这样的代码问题。 有什么更好的办法吗?它可以在Java中运行,但是可以在C ++和ActionScript中运行吗? 谢谢你的答案。 问题答案: 请勿从构造函数中调用过多的方法。 引用 有效Java 2nd Edition,条
序对 为了在具体的表面上实现这一数据抽象,scheme 提供了一种称为 序对 的复合结构,这种结构可以通过 cons 构造出来。过程 cons 取两个参数,返回一个包含这两个参数作为其成分的符合数据对象。其实个人理解就是二维数据描述,可以抽象的理解成平面点。 给出一个序对,可以用基本过程 car 和 cdr 方式取出。 (define x (cons 1 2)) (car x) 1 (cdr
我有一个java类,它只有静态方法和字段,所以我不想为此创建任何对象。我可以从两个方面来理解, 创建类摘要 使用私有构造函数。 这两种方法哪一种更好?
问题内容: 根据Node.js手册: 如果您希望模块导出的根是一个函数(例如构造函数),或者想一次导出一个完整的对象而不是一次构建一个对象,则将其分配给module.exports而不是export 。 给出的示例是: 并像这样使用: 我的问题:为什么示例不使用正方形作为对象?以下内容是否有效,是否会使示例更加“面向对象”? 问题答案: CommonJS模块允许两种方法来定义导出的属性。无论哪种情
问题内容: 在Java中,在抽象类中使用私有构造函数的目的是什么? 在一个评论中,我得到了这个问题,我很好奇,在什么情况下我们需要以这种方式使用构造函数? 我认为它可以与抽象类中的另一个构造函数一起使用,但这非常简单。它也可以用于构造将超过抽象类的静态内部类。 也许还有更优雅的用法? 问题答案: 如果构造函数是类的 唯一 构造函数,则原因很明确:防止子类化。一些类仅充当静态字段/方法的持有者,而不
TypeScript中非抽象类(非抽象构造函数)的类型签名如下: 这也称为可更新类型。但是,我需要一个抽象类(抽象构造函数)的类型签名。我理解它可以定义为具有类型,但这太宽泛了。难道没有更精确的替代方案吗? 编辑: 为了阐明我的意思,下面的小片段演示了抽象构造函数和非抽象构造函数之间的区别: 类型'typeof实用程序'不能分配给类型'new(... args: any[])= 无法将抽象构造函数