我有这个场景。会有两种类型的项目构建,
如果是开发人员构建,我将需要编译更多的包并将它们包含在构建结构中。
在这种情况下有共同文件MainClass
,
Mainclass {
if(devFeature){
CommonInterface int = new DeveloperFile();
........ other logic ......
}else{
CommonInterface int = new NormalFile();
........ other logic ......
}
}
如上所述MainClass
是一个CommonResource,只有在Dev构建期间才会引用持有DeveloperFile
的jar。 但在正常构建期间,这会导致编译错误。
我该如何解决这个问题?特定的任何设计模式?
答案 0 :(得分:2)
您可以使用reflection来实例化您的课程。
这是一个基本示例,concreteClass
变量可以从文件中读取或作为参数传递给main方法:
String concreteClass = ...
CommonInterface instance = Class.forName(concreteClass).newInstance();
...
或者更好的是,您可以使用在幕后使用反射的框架。例如,Spring就是这样做的。
在这种情况下,使用具体类或其他类只需要在配置文件中进行修改。
答案 1 :(得分:2)
Inversion of Control可能是这里最合适的模式(在Java中,一个框架是Spring,另一个流行的是JEE的EJB),因为你基本上需要的是环境告诉你的MainClass
要使用哪个班级。
您可以使用的另一种模式是Service Locator pattern。您可以查看JDBC驱动程序的位置 - 在JDBC4之前的版本中,它基本上是这样的:
CommonInterface
的实施可用的信息MainClass
名称(作为String
,因此不会创建编译时依赖项)MainClass
调用Class.forName(implName)
,这会加载类并调用静态初始化程序,注册实现MainClass
使用注册表作为工厂,调用registry.getCommonInterface()
JDBC4使用了Java的内置Service provider机制,您也可以使用它。
答案 2 :(得分:-2)
简单的事情:使用工厂。您真正需要的是拥有两个版本的CommonInterfaceFactory
,一个用于创建DeveloperFile
的实例,另一个用于创建NormalFile
的实例。确保第一个包含在开发人员构建中,第二个包含在正常构建中。
CommonInterface int1 = CommonInterfaceFactory.makeCommonInterfaceInstance();