代码之家  ›  专栏  ›  技术社区  ›  letmaik

在不访问非默认构造函数的情况下用引用初始化对象

  •  0
  • letmaik  · 技术社区  · 17 年前

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

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

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

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

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

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

    谢谢!

    4 回复  |  直到 17 年前
        1
  •  4
  •   Alex Martelli    17 年前

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

        2
  •  2
  •   svachon    17 年前

    你想做的和春天做的非常相似。 在XML文件中,控制器节点将有子节点来指定要设置的属性。 通过调用默认的构造函数来初始化控制器。然后使用反射设置属性。

        3
  •  0
  •   Joshua    17 年前

    在另一种语言中类似的地方,我已经知道使用init()解决方案。

        4
  •  0
  •   Peter Lawrey    17 年前

    另一个选项可以是使用不安全的.allocateInstance(类)创建实例,而不调用构造函数。可以使用反射设置字段。

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