Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过单例实例方法返回不同的类型_Java - Fatal编程技术网

Java 如何通过单例实例方法返回不同的类型

Java 如何通过单例实例方法返回不同的类型,java,Java,如何在类承包商中返回另一个类实例? 我的伪代码是: class test { private test() {} public static test getInstance() { if(Condition) { return new otherClass(); } else { return new test(); }

如何在类承包商中返回另一个类实例?
我的伪代码是:

class test
{
    private test() {}

    public static test getInstance() 
    {
        if(Condition)
        {
            return new otherClass();
        }
        else
        {
            return new test();
        }
    }
}

getInstance()
方法的返回类型必须反映您可以返回的所有类类型的公共类型,即它将是所有这些类共享的超类型或公共接口

e、 g

因此,在上面的例子中,
Car
Bus
都源自
Vehicle
Vehicle
可以是超类或接口)。否则,将违反方法返回类型和所返回内容之间的约定。请注意,您可以选择继承层次结构中的任何超级类型—这两种类型都通用的任何类型(如果您返回一个
对象
,或者类似的简单化对象,如果不强制转换它,您就无法有效地处理该对象,这表明您的设计中存在一些不正确的地方)

您的呼叫代码只需要期望并接收一辆
车辆
(而不关心它是
汽车
还是
公交车


有关更多信息,请参阅。有用的是,它使用了与我上面详述的相同的
工具
抽象。

首先:java中的类以大写字母开头(按惯例)

一般来说,父母明确地构建其子是一种不好的做法,但你可以做的是让工厂为你构建它,这样“子”就不会由父母构建

工厂可以从外部源(props文件等)加载,也可以在getInstance签名中提供,在这种情况下,它不必是类中的成员

请注意,工厂必须能够构造您的类,因此它必须是Test的子类或在同一个包中,无论哪种方式,构造函数都必须受到保护,或者您必须提供一个在protected中构造的方法

下面的例子显示了两种方法,第一种是逻辑在“测试”类中,另一种是逻辑在工厂中,两者都有各自的优点和缺点,我将使用第一种方法,因为它以一种更“正确”的方式封装逻辑


返回新的OtherClass()
您必须在不同的行上更改getInstance方法的返回类型,为什么要这样做?对于您的代码,
otherClass
必须是
test
的子类,因为我需要在我的应用程序中使用覆盖系统,例如,对于每个客户端,我都有一个特殊的类。make
otherClass
(或@MarounMaroun建议的
OtherClass
extend
您的
test
类。您能解释更多细节吗?
public Object getInstance()呢OFC?你必须检查这个对象的类型。你可以考虑返回一个接口而不是一个对象,因此接口的实现可以在不同的类中针对不同的情况来完成。在你的答案中添加接口,这样就很清楚了。工厂类从测试类扩展了吗?看看我刚刚做的一个编辑。它可以是一个子类,也可以在同一个包中-无论哪种方式,测试的CTor都必须受到保护,或者它应该为构造提供一个受保护的方法。我想我不知道,我需要提供一个真实的示例:(你能帮我吗?你需要什么帮助?我认为我的解决方案不适合好的应用程序。是吗?你能在回复中插入工厂类代码吗?非常感谢你的合作
public Vehicle getInstance() {
   if (...) {
     return new Car();
   }
   else {
     return new Bus();
    }
}
   Vehicle v = Factory.getInstance();
    v.turnIgnitionOn();
    v.drive();
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();
    }
}