在Java中解决分配问题



在阅读了这个线程之后,我明白了在Java中不可能分配给this。但是有什么变通办法吗?我有以下情况。我正在编写一个子类B,但基类A没有任何明确的构造函数或方法来创建给定参数的对象。唯一可用的方法是调用一些外部函数F():

public class B extends A {   
   public B(some args) {     
       A a = F(some args);
       this = a;
   }
}

AF()都来自外部库,A是一个非常复杂的对象,而F()实现了一个复杂的算法。

我能想到的唯一解决方案就是不做一个子类:

public class B {
   public A a;   
   public B(some args) {     
       a = F(some args);      
   }
}

不过它看起来不太吸引人。在这种情况下,什么是最不丑陋的解决方案?

您不创建子类的解决方案是正确的。这就是组合,您应该始终更喜欢它而不是继承。因此,即使A有正确的构造函数,你也不应该让B成为A的子类,除非你有一个特定的要求迫使你这样做

仅当需要将B的实例作为A的实例传递时才使用继承。但实际上,您应该很少需要这样做,除非您正在处理设计糟糕的代码。你应该使用接口,所以你会有class A,它实现了一些接口,让我们称之为interface IA。那么,您就可以简单地拥有class B implements IA,而不是A的子类。如果需要的话,B中有A类型的私有成员变量

(还有一个问题是什么时候使用接口,什么时候使用抽象基类,但我将把它排除在这个答案之外。)


请注意,现代JavaIDE使创建委托变得非常容易,坦率地说,在没有这种IDE的情况下编写Java是错误的。手工编写所有这些样板文件容易出错、乏味,而且会让你毫无理由地讨厌Java。使用现代IDE,首先添加私有成员变量a,可能将光标放在上面或右键单击它以打开上下文菜单,然后找到"插入代码…"或类似的选项。从那里可以找到类似"添加委托…"的内容。然后,您只需单击要添加到B中的A的哪些方法并将其委托即可。IDE应该像这样在B中创建代码。

int method() {
    return a.method();
}

这使得实际遵循"组合而非继承"非常简单。

最新更新