【问题标题】:Initializing an object with references without accessing a non-default constructor在不访问非默认构造函数的情况下使用引用初始化对象
【发布时间】:2009-05-25 16:54:03
【问题描述】:

假设我有一个名为“Controller”的接口。有几个类实现了这个接口,我不知道这些类(例如,类名位于 xml 文件中)。现在,为了让这个控制器实现类工作,他们必须获得对其他对象(可能是数据对象)的一些引用。这是我的问题,即初始化此类对象(控制器对象)的最佳方法是什么?

我想到了几种解决方案,但我不确定这里最好的方法是什么。

首先:当从类名实例化对象时,我可以搜索“特殊”构造函数(通过反射),它具有控制器对象所需的对象引用。但是从我在其他问题中读到的内容来看,这不太可能是一个好的解决方案,因为我会强制在类中存在一个特殊的构造函数。有时我读到反思通常是邪恶的,最好避免。

第二:我在控制器接口中添加了一个特殊的 init(a,b,c) 方法,需要在创建对象后直接调用该方法。这将强制对对象进行一系列调用(首先是 init(..),然后是 rest)以使其工作,这也可能很糟糕。顺便说一句,init() 方法在接口中通常是一件坏事吗?

第三:阅读this 评论后,我想到了以下内容:我没有使用实现控制器接口的类的类名(在 xml 文件中),而是使用类名属于具体控制器类的工厂。这个工厂将使用方法 createController(a,b,c) 实现一个接口,然后工厂将知道它必须实例化哪个类以及调用哪个构造函数来传递其他引用(如数据对象)。这样做的缺点是额外的类只是为了实例化控制器类,一般来说可能会有一点开销。

您认为最好的方法是什么?或者你能想出比这三种方式更好的方法吗?

谢谢!

【问题讨论】:

  • 我会首先考虑该 XML 文件是否真的是您想要做的。
  • 嗯,不知何故我需要找出我有哪些控制器类。但是你可能是对的,我试图创建一种模块系统,我仍然是一个学习的学生,所以对世界来说可能不太像样:P

标签: java interface constructor initialization


【解决方案1】:

在您提到的方法中,我会选择第二种方法(基于工厂的方法)。但是,由于您所做的一种依赖注入形式,还请考虑 Guice,http://code.google.com/p/google-guice/ - 它可能使您能够自动化大部分工作。

【讨论】:

  • +1 用于 Guice 类型的东西。第二种选择是两阶段建设。你是说第三个选项吗?
  • 谢谢!前段时间我已经对 Guice 进行了一些研究,但直到现在我才真正意识到这是我已经在做的事情——只是手动的。问题是这是针对一个已经发展壮大的大学项目。我很想使用它,但我认为这在 atm 上并不容易。我想我会坚持工厂解决方案。
  • 请注意 - 我在一个新项目中使用 Guice,我喜欢它。所以谢谢推荐!
  • @neo,不客气——我不是 Java 专家,但在我看来,我开发 Guice 的同事做得很好!-)
【解决方案2】:

您尝试做的与 Spring 所做的非常相似。 在您的 xml 文件中,您的控制器节点将具有子节点来指定要设置的属性。 您的控制器是通过调用默认构造函数来实现的。然后使用反射设置属性。

【讨论】:

  • 春天+1。 Spring 配置的一些示例:static.springframework.org/spring/docs/2.0.x/reference/…
  • +1 春天。您似乎正在尝试编写自己的依赖注入。有很多(Spring、Guice、Seam,仅举几例)所以这是非常多余的。
  • 看起来也很有趣,下次我肯定会使用这样的框架,但现在要像我在关于 Guice 的评论中解释的那样集成其中一个框架,工作量太大。
【解决方案3】:

在另一种语言中,我知道使用 init() 解决方案。

【讨论】:

    【解决方案4】:

    另一种选择是使用 Unsafe.allocateInstance(Class) 创建实例而不调用构造函数。您可以使用反射设置字段。

    这假设您的构造函数没有任何副作用。

    【讨论】:

    • Hm 似乎有点 hacky,我需要强制某些字段名称或将它们放入 xml 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2011-05-15
    • 2023-04-04
    • 1970-01-01
    • 2011-08-09
    • 2023-03-14
    相关资源
    最近更新 更多