如何在班级承包商中返回另一个班级实例? 我的伪代码是:
class test
{
private test() {}
public static test getInstance()
{
if(Condition)
{
return new otherClass();
}
else
{
return new test();
}
}
}
答案 0 :(得分:3)
getInstance()
方法的返回类型必须反映您可以返回的所有类类型的常见类型,即它将是超类型或公共接口< / em>所有这些类共享。
e.g。
public Vehicle getInstance() {
if (...) {
return new Car();
}
else {
return new Bus();
}
}
因此,在上文中,Car
和Bus
都来自Vehicle
(Vehicle
可以是超类或接口)。否则,将违反方法返回类型与返回的内容之间的契约。请注意,您可以在继承层次结构中选择任何超类型 - 两者共有的任何内容(如果您返回Object
或类似简单的东西,您无法在不强制转换的情况下使用该对象,这是一个符号那个东西在你的设计中是不对的)
您的主叫代码只会期望并收到Vehicle
(并不关心它是Car
还是Bus
)
Vehicle v = Factory.getInstance();
v.turnIgnitionOn();
v.drive();
有关详细信息,请参阅this article。有用的是,它使用与我上面详述的相同的Vehicle
抽象。
答案 1 :(得分:0)
首先:java中的类以大写字母开头(按照惯例)
一般来说,父母明确地构建它的儿子是一种不好的做法,但你可以做的是找一个工厂,为你建造它,以便儿子&#34;不会由父母建造。
工厂可以从外部源(道具文件ETC)加载或在getInstance签名中给出,在这种情况下,它不必是该类中的成员。
请注意,工厂必须能够构建您的类,因此它必须是Test的子类或在同一个包中,无论是构造函数必须受到保护还是您必须提供受保护的建筑方法......
以下示例显示了两种方法,在第一种情况下,逻辑在&#34;测试&#34;在另一个逻辑在工厂里,两个都有他们的缺点和优点,我会选择第一个,因为它将逻辑封装在一个更正确的&#34;方式...
class Test
{
private TestFactory factory = null
protected Test(...) {...}
public static Test getInstance()
{
if(Condition)
{
return factory.getOtherClass();
}
else
{
return factory.getTestClass();
}
}
public static Test getInstance2()
{
return factory.construct(Condition_Params);
}
}
public abstract class TestFactory {
public static Test getTestClass(){
return new Test();
}
public static Test getOtherClass(){
return new OtherTest();
}
}