Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用引用初始化对象而不访问非默认构造函数_Java_Interface_Constructor_Initialization - Fatal编程技术网

Java 使用引用初始化对象而不访问非默认构造函数

Java 使用引用初始化对象而不访问非默认构造函数,java,interface,constructor,initialization,Java,Interface,Constructor,Initialization,假设我有一个名为“Controller”的接口。有几个类实现了这个接口,我不知道这些类(例如,类名位于xml文件中)。现在,对于实现类的控制器,它们必须获得对其他对象(可能是数据对象)的一些引用。这是我的问题,即初始化这些对象(控制器对象)的最佳方式是什么 我想到了几种解决方案,但我不确定这里最好的方法是什么 首先:当从类名实例化对象时,我可以搜索“特殊”构造函数(通过反射),该构造函数具有控制器对象所需的对象引用。但从我在其他问题中读到的来看,这不太可能是一个好的解决方案,因为我会强制类中存在

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

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

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

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

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

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


谢谢

在您提到的方法中,我选择第二种(基于工厂的方法)。但是,既然你正在做的是依赖注入的一种形式,那么也可以考虑Guice,它可以使你自动化这项工作。

< P>你提到的方法,我会选择第二个(基于工厂的)。但是,因为你所做的是依赖注入的一种形式,也考虑Guice,它可能使你能够自动完成这项工作。

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

< P>在另一种语言中类似的东西,我已经知道使用它()。解决方案。

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

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

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


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

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


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

+1对于Spring。弹簧配置的一些示例:+1表示弹簧。似乎您正在尝试编写自己的依赖注入。有很多(Spring、Guice、Seam,仅举几个例子),所以这是相当多余的。看起来也很有趣,我下次一定会使用这样的框架,但现在要集成其中一个,就像我在关于Guice的评论中解释的那样,工作太多了。+1 for Spring。弹簧配置的一些示例:+1表示弹簧。似乎您正在尝试编写自己的依赖注入。有很多(Spring、Guice、Seam,仅举几个例子),所以这是相当多余的。看起来也很有趣,我下次肯定会使用这样的框架,但现在要集成其中一个,就像我在关于Guice的评论中解释的那样,将是太多的工作了。对于Guice类型的东西,加1。第二种选择是两阶段建设。你是说第三种选择吗?谢谢!不久前我已经对Guice进行了一些研究,但直到现在我才真正意识到这是我已经在做的事情——只是手动操作。问题是,这是一个已经成长的大学项目。我很想用它,但我认为这不太可能。我想我会坚持使用工厂的解决方案。只是一个小提示-我在一个新项目中使用Guice,我喜欢它。谢谢你的推荐@neo,不客气--我不是Java专家,但在我看来,开发Guice的同事做得不错+一个用于Guice类型的东西。第二种选择是两阶段建设。你是说第三种选择吗?谢谢!不久前我已经对Guice进行了一些研究,但直到现在我才真正意识到这是我已经在做的事情——只是手动操作。问题是,这是一个已经成长的大学项目。我很想用它,但我认为这不太可能。我想我会坚持使用工厂的解决方案。只是一个小提示-我在一个新项目中使用Guice,我喜欢它。谢谢你的推荐@neo,不客气--我不是Java专家,但在我看来,开发Guice的同事做得不错我会先想一想abo