我正在尝试在Java中的抽象类中编写工厂方法(所以我希望它返回扩展类的新实例,而不是超类)。
在PHP中,我使用self
关键字
abstract class Superclass {
public static function factory($arg) {
return new self($arg);
}
private function __construct($arg) {}
abstract public function doSomething() {}
}
Java是否有self
这样的关键字可用于此?
答案 0 :(得分:8)
没有;在Java中,静态方法的继承方式与非静态方法的继承方式不同。子类将具有其超类的静态方法,但是当它们执行时,它们将在超类的上下文中执行 - 因此没有可以在静态方法中使用的关键字来找出调用该方法的类。
编辑:一个更精确的表述是静态方法根本不会被继承;但是,该语言允许我们使用Subclass.foo()
来调用静态方法Superclass.foo()
。
根据您似乎想要实现的目标,您可能希望实现Abstract Factory pattern。它大概是这样的:
public abstract class Superclass {}
public class SubclassA extends Superclass {}
public class SubclassB extends Superclass {}
public abstract class AbstractFactory {
public abstract Superclass Create();
}
public class FactoryA extends AbstractFactory {
public Superclass Create() {
return new SubclassA();
}
}
public class FactoryB extends AbstractFactory {
public Superclass Create() {
return new SubclassB();
}
}
现在,你可以,例如创建一个采用AbstractFactory
的方法(实际上,它将是FactoryA
或FactoryB
。在此对象上调用Create()
将生成SubclassA
或SubclassB
。
编辑:修复了编译错误(忘了让工厂扩展AbstractFactory
)。
答案 1 :(得分:3)
如果您绝对必须,则可以使用此代码形成静态上下文:
Class cls = new Object() { }.getClass().getEnclosingClass();
Object instance = cls.newInstance();
你的班级需要一个无效的构造函数。
答案 2 :(得分:2)
你需要一些黑客来实现这一目标。我能想到的一种方法是:
public static <T extends SuperClass> T factory(Class<T> clazz) {
return clazz.newInstance();
}
答案 3 :(得分:0)
我认为在Java中找不到“当前”子类的名称是不可能的。特别是一些动态对象生成是不可能的。
所以你需要在每个子类中定义静态函数。