什么是Java';s';自我';关键词
我试图在Java的抽象类中编写工厂方法(因此我希望它返回扩展类的新实例,而不是超类) 在PHP中,我会使用什么是Java';s';自我';关键词,java,php,oop,Java,Php,Oop,我试图在Java的抽象类中编写工厂方法(因此我希望它返回扩展类的新实例,而不是超类) 在PHP中,我会使用self关键字: abstract class Superclass { public static function factory($arg) { return new self($arg); } private function __construct($arg) {} abstract public function doSomet
self
关键字:
abstract class Superclass {
public static function factory($arg) {
return new self($arg);
}
private function __construct($arg) {}
abstract public function doSomething() {}
}
Java是否有一个像self这样的关键字,我可以使用它?我认为在Java中不可能找到“当前”子类的名称。尤其是一些动态对象生成是不可能的
因此,您需要在每个子类中定义该静态函数;在Java中,静态方法的继承方式与非静态方法不同。子类将具有其超类的静态方法,但当它们执行时,它们将在超类的上下文中执行-因此,在静态方法中没有关键字可用于找出调用该方法的类 编辑:更精确的表述是,静态方法根本不被继承;但是,该语言允许我们使用
Subclass.foo()
调用静态方法Superclass.foo()
基于您似乎想要实现的目标,您可能希望实现。大致是这样的:
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()
,将生成子类a
或子类b
编辑:修复了编译错误(忘记让工厂扩展AbstractFactory)。要实现这一点,您需要一些技巧。我能想到的一种方法是:
public static <T extends SuperClass> T factory(Class<T> clazz) {
return clazz.newInstance();
}
公共静态T工厂(clazz类){
返回clazz.newInstance();
}
如果您必须您可以在静态上下文中使用此代码:
Class cls = new Object() { }.getClass().getEnclosingClass();
Object instance = cls.newInstance();
你的类需要一个空构造函数。@Ross:也许-你需要在什么上下文中创建实例(为什么你需要这个方法而不是直接使用子类构造函数)?您是否曾经需要在不事先知道需要什么样的类的情况下创建实例?如果是这样,请参阅更新以获取关于抽象工厂模式的代码示例;否则,这种模式可能会有点过头了。:-)我明白了,关键是要让事情充满活力。@tada:请解释一下;我在哪里自相矛盾?(我提出抽象工厂模式是因为我认为他想要实现这一目标,但后来我意识到他可能有其他意图,所以我只想说明,这种模式只在某些情况下有用。或者你在考虑其他事情吗?@tada:啊;我想你指的是我对包含编译错误的答案的否决票;我现在已经修复了错误(至少是我能发现的错误)。