有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

class test
{
    private test() {}

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

共 (2) 个答案

  1. # 1 楼答案

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

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

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

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

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

    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();
        }
    }
    
  2. # 2 楼答案

    你的getInstance()方法的返回类型必须反映你可以返回的所有类类型的公共类型,也就是说,它将是一个由所有这些类共享的超类型公共接口

    例如

    public Vehicle getInstance() {
       if (...) {
         return new Car();
       }
       else {
         return new Bus();
        }
    }
    

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

    您的调用代码只需要期望并接收一个^{(而不关心它是Car还是^{

       Vehicle v = Factory.getInstance();
        v.turnIgnitionOn();
        v.drive();
    

    有关更多信息,请参见this article。有用的是,它使用了与我上面详述的相同的Vehicle抽象