【问题标题】:Abstracting initialization抽象初始化
【发布时间】:2012-11-08 19:34:22
【问题描述】:

我有一些类,只有在传递的参数为真时才想初始化它们。 事实证明,这个方法的每个实现都是相同的,只是用于不同的类。

public static NamedScene getScene(boolean init) {
    if (mainMenu == null) {
        mainMenu = new MainMenu();
    }
    if (init) mainMenu.init();
    return mainMenu;
}

我想抽象这个方法,所以我不必通过调用MainMenu.init(true); 手动访问它,而是使用场景扩展抽象类的scene.init(true);

每个类都有一些默认属性,例如通过抽象方法 getName() 访问的名称。我希望该方法有时在没有 init() 的情况下返回类实例,有时在使用 init() 时返回。

【问题讨论】:

  • 好的,这里的问题是什么?
  • 什么是scene?它是从哪里来的?请发布一个简短但完整的程序,展示您想要做什么。
  • scene 扩展了抽象类。我的意思是我不想指定类本身,而只是通过抽象来访问它。

标签: java abstract-class javafx-2 abstract abstraction


【解决方案1】:

考虑为此使用通用方法。
这不是您想要的确切代码,但您会从中理解:

  public static <T> T conditionalInit(Class<T> clazz, boolean okToInit) {
    try {
      return okToInit?clazz.newInstance() : null;
    } catch (Exception e) {
      return null;
    }
 }

用法:

Person p = conditionalInit(Person.class, true); //not null
Person p2 = conditionalInit(Person.class, false); //null

评论:
1.如果你必须执行“init”方法,我建议你所有的类都实现一个Initializable接口,该接口将包含一个“init”方法。
然后该方法的签名将是:
public static T conditionalInit(Class clazz, boolean okToInit)


2.我提醒你,静态泛型方法可以存在于非泛型类中。

【讨论】:

  • 重点是,我不想返回null。每个类都有一些默认属性,例如通过抽象方法 getName() 访问的名称。我希望该方法有时在没有 init() 的情况下返回类实例,有时在使用 init() 时返回。
  • @NightRa:我认为一个更详细的例子来说明你想要实现的目标会有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 2011-05-01
  • 2021-11-27
  • 1970-01-01
  • 2016-05-21
  • 2014-10-13
相关资源
最近更新 更多