【问题标题】:using newInstance to create objects使用 newInstance 创建对象
【发布时间】:2012-02-22 14:46:03
【问题描述】:

我正在做Thinking In Java一书中的一些练习。我在一项练习中遇到了一些问题。它说:

构造函数是一种工厂方法。修改RegisteredFactories.java,使类对象不使用显式工厂,而是存储在List中,并使用newInstance()来创建每个对象。

我怎样才能做到这一点?下面是工厂接口和 RegisteredFactories 类的代码。谢谢

package typeinfo.factory;    
public interface Factory<T> { T create(); } ///:~
package cont;

import typeinfo.factory.*;
import java.util.*;


class Part {

  public String toString() {
    return getClass().getSimpleName();
  }

  static List<Factory<? extends Part>> partFactories =
    new ArrayList<Factory<? extends Part>>();     

  static {
    // Collections.addAll() gives an "unchecked generic
    // array creation ... for varargs parameter" warning.
    partFactories.add(new FuelFilter.Factory());
    partFactories.add(new AirFilter.Factory());
    partFactories.add(new CabinAirFilter.Factory());
    partFactories.add(new OilFilter.Factory());
    partFactories.add(new FanBelt.Factory());
    partFactories.add(new PowerSteeringBelt.Factory());
    partFactories.add(new GeneratorBelt.Factory());
  }

  private static Random rand = new Random(47);
  public static Part createRandom() {
    int n = rand.nextInt(partFactories.size());
    return partFactories.get(n).create();
  }
}

class Filter extends Part {}

class FuelFilter extends Filter {
  // Create a Class Factory for each specific type:
  public static class Factory
  implements typeinfo.factory.Factory<FuelFilter> {
    public FuelFilter create() { return new FuelFilter(); }
  }
}

class AirFilter extends Filter {
  public static class Factory
  implements typeinfo.factory.Factory<AirFilter> {
    public AirFilter create() { return new AirFilter(); }
  }
} 

class CabinAirFilter extends Filter {
  public static class Factory
  implements typeinfo.factory.Factory<CabinAirFilter> {
    public CabinAirFilter create() {
      return new CabinAirFilter();
    }
  }
}

class OilFilter extends Filter {
  public static class Factory
  implements typeinfo.factory.Factory<OilFilter> {
    public OilFilter create() { return new OilFilter(); }
  }
} 

class Belt extends Part {}

class FanBelt extends Belt {
  public static class Factory
  implements typeinfo.factory.Factory<FanBelt> {
    public FanBelt create() { return new FanBelt(); }
  }
}

class GeneratorBelt extends Belt {
  public static class Factory
  implements typeinfo.factory.Factory<GeneratorBelt> {
    public GeneratorBelt create() {
      return new GeneratorBelt();
    }
  }
} 

class PowerSteeringBelt extends Belt {
  public static class Factory
  implements typeinfo.factory.Factory<PowerSteeringBelt> {
    public PowerSteeringBelt create() {
      return new PowerSteeringBelt();
    }
  }
} 

public class RegisteredFactories {
  public static void main(String[] args) {
    for(int i = 0; i < 10; i++)
      System.out.println(Part.createRandom());
  }
}

【问题讨论】:

  • “类对象存储在列表中”。哪个列表?
  • 这是书中的确切问题,有点令人困惑。我假设它是任何列表(但为什么作者使用 The)或已在 RegisteredFactories 类中使用的列表。
  • 好的,以后我会更加努力的。很难回到我过去提出的每个问题
  • @aretai:有多难?以下是您之前的问题的完整列表:stackoverflow.com/users/1124682/aretai?tab=questions
  • 仅限提问。您可以在profile page 中查看您过去的问题

标签: java factory


【解决方案1】:

这里:

import java.util.*;

class Part {

  public String toString() {

    return getClass().getSimpleName();

  }

  static List<Class> partFactories = new ArrayList<Class>();

  static {

    // Collections.addAll() gives an "unchecked generic

    // array creation ... for varargs parameter" warning.

    partFactories.add(FuelFilter.class);

    partFactories.add(AirFilter.class);

    partFactories.add(CabinAirFilter.class);

    partFactories.add(OilFilter.class);

    partFactories.add(FanBelt.class);

    partFactories.add(PowerSteeringBelt.class);

    partFactories.add(GeneratorBelt.class);
  }


  private static Random rand = new Random(47);

  public static Part createRandom() throws Exception {

    int n = rand.nextInt(partFactories.size());

    return (Part)(partFactories.get(n).newInstance());

  }

}



class Filter extends Part {}

class FuelFilter extends Filter {
}
class AirFilter extends Filter {
}
class CabinAirFilter extends Filter {
}
class OilFilter extends Filter {
}
class Belt extends Part {}
class FanBelt extends Belt {
}
class GeneratorBelt extends Belt {
}
class PowerSteeringBelt extends Belt {
}



public class aa{

  public static void main(String[] args) {

    for(int i = 0; i < 10; i++)

      try {System.out.println(Part.createRandom()); }catch (Exception e) {}

  }

}

【讨论】:

    【解决方案2】:

    static List&lt;Factory&lt;? extends Part&gt;&gt; partFactories
    这就是列表,
    它包含几个工厂并在静态块中启动。
    此代码使用 createRandom 方法通过其工厂随机创建对象

    这个想法是,不是通过调用 new 创建一个对象,而是使用它的工厂创建一个对象
    这里的所有工厂都实现了接口 Factory,这意味着它们有一个名为 create()
    的方法,该方法返回所需类(工厂所属的类)的新实例

    【讨论】:

    • 好的,如果那是作者正在谈论的列表。我应该如何更改代码以满足问题的标准?
    • 这是您在列表中添加的内容:PowerSteeringBelt.class;当您遍历列表以创建实例时,您调用 partFactories.get(n).getClass().newInstance();并且您可以删除所有与工厂相关的代码
    • 我试图这样做。据我了解,我需要首先将列表重新定义为静态 List partFactories = new ArrayList(); //但是编译器不允许这样做。之后我需要更改 partFactories.add(new PowerSteeringBelt.Factory());进入 partFactories.add(PowerSteeringBelt.class);那怎么解决呢?
    • 将列表更改为:static List partFactories = new ArrayList();之后将创建行更改为: return (Part)(partFactories.get(n).newInstance());添加到列表中的内容也应如下所示:partFactories.add(FuelFilter.class);
    • 似乎除了 return 语句之外一切正常,因为它必须处理 IllegalAccessException。我试图在 try-catch 中使用它,但整个方法说它需要返回 Part1(将 Part 更改为 Part1): public static Part1 createRandom() { int n = rand.nextInt(partFactories1.size()); //返回partFactories1.get(n).create(); //return (Part1)(partFactories1.get(n).newInstance());尝试 { 返回 (Part1) (partFactories1.get(n).newInstance()); } 捕捉(异常 e){ e.printStackTrace(); } }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多