【问题标题】:Making new objects of different classes in a single for loop在单个 for 循环中创建不同类的新对象
【发布时间】:2016-11-13 02:11:44
【问题描述】:

我对编程有点陌生,但我被困住了。假设我在一个项目中有五个不同的类:foo1、foo2、foo3、foo4 和 foo5,它们都做不同但相似的事情。现在说我需要为每个对象创建一个新对象,例如: foo1 bar1 = 新的 foo1(); foo2 bar2 = 新的 foo2(); foo3 bar3 = 新的 foo3(); 等等。 当然可以,但是我真的想找到一种方法来节省大量空间,如果我可以在一个 for 循环中实例化我需要的所有对象,或者至少将我想要创建的所有对象放在一个可以解决的单个数组。如果它都是同一个类,我可以让它工作,但如果它不同的话就不行。有可能吗?

【问题讨论】:

  • 你应该阅读什么是多态性

标签: java instantiation


【解决方案1】:

尝试阅读有关可在 Java 中使用的多态性的内容。接口和抽象类是如何工作的。什么是 extendsimplements 关键字在 Java 和其他...

我发现这些教程看起来不错:

TutorialsPoint polymorphism

Oracle polymorphism

【讨论】:

    【解决方案2】:

    如果类名是按顺序排列的,则可以如下使用:

    For(int i = 0; i < 10; i++) {
        try {
            Class<?> cls = Class.forName("foo"+i);
            arr[i] = cls.newInstance();
        } catch (ClassNotFoundException e) {
            System.out.println("Class not found " + e);
        }
    }
    

    但由于所有对象都是异构的,因此数组必须是 Object[] 类型

    【讨论】:

      【解决方案3】:

      听起来factory method pattern 就是您要找的。​​p>

      您尝试以多态方式处理的任务与通常的任务有些不同,因为实例化通常需要您知道要创建的对象的具体类型。工厂将允许您这样做。


      首先,您需要确保要实例化的类型派生自同一个接口:

      interface Foo { }
      class Foo1 implements Foo { }
      class Foo2 implements Foo { }
      

      然后你可以定义一个工厂类型:

      interface FooFactory {
          Foo createFoo();
      }
      

      创建FooFactory 的实现,返回不同类型的Foo

      class Foo1Factory implements FooFactory {
          public Foo createFoo() {
              return new Foo1();
          }
      }
      
      class Foo2Factory implements FooFactory {
          public Foo createFoo() {
              return new Foo2();
          }
      }
      

      将这些工厂存储在一个数组中:

      FooFactory[] factories = {
          new Foo1Factory(),
          new Foo2Factory()
      }
      

      然后遍历数组,在每个工厂调用createFoo()

      for(FooFactory factory : factories) {
          Foo foo = factory.createFoo();
          //...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多