在编译时选择类实现

bgd*_*223 5 java

假设我有一个Animal接口和特定的类来实现它CatDog. 在程序的入口处,有这个:

if (choice == 0) {
    Animal A = new Cat();
}
else if (choice == 1) {
    Animal A = new Dog();
}
Run Code Online (Sandbox Code Playgroud)

我希望在编译时(例如,在 Maven 构建期间)choice填充参数 ,以便:

  • 如果我使用选择 == 0 进行编译,则不会编译 Dog 类
  • 如果我使用选择 == 1 进行编译,则不会编译 Cat 类

这样做的原因是“Cat”和“Dog”类具有单独/不同的依赖关系。

基本上,目标是为“A 是一只猫”制作一个版本,为“A 是一只狗”制作另一个版本。当我打包 JAR 时,运行 JAR 的用例将是“Cat”或“Dog”(取决于环境),而不是“Cat”和“Dog”——所以,不需要所有项目中的依赖项。

实现这一目标的最佳方法是什么?

dpr*_*dpr 4

您可以将 的两个实现Animal移至两个单独的项目。每个项目都可以有自己的依赖项。然后,您可以将两个项目彼此独立地打包(包括各自的依赖项),并且Animal在运行时只能知道其中的一种实现。

\n\n

你最终可能会得到这样的结果:

\n\n
base-animals\n  \xe2\x94\x9c com.wang.animals.base.Animal\n  \xe2\x94\x94 com.wang.animals.base.AnimalFactory\n\ndog-application\n  \xe2\x94\x9c com.wang.animals.dogs.Dog\n  \xe2\x94\x94 application.properties // animalClass=com.wang.animals.dogs.Dog\n\ncat-application\n  \xe2\x94\x9c com.wang.animals.cats.Cat\n  \xe2\x94\x94 application.properties // animalClass=com.wang.animals.cats.Cat\n
Run Code Online (Sandbox Code Playgroud)\n\n

两者dog-applicationcat-application依赖于base-animals可能的其他项目,但不需要彼此了解。然后,您的构建可以创建一个dog-application.jar和一个cat-application.jar,可以根据您的喜好进行运输/处理。

\n\n

为了确定Animal在运行时使用哪个,我将实现一个AnimalFactory查找Animal选择的实现的方法(我省略了异常处理和其他内容,因为这只是一个示例):

\n\n
public class AnimalFactory {\n\n  public static Animal createAnimal() throws Exception {\n    final String animalClassName = getThisValueFromApplicationProperties();\n    return Class.forName(animalClassName).getConstructor().newInstance();\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您不关心CatDog一起发货,您也可以将它们移动到base-animals项目中,并将application.properties文件保留在dog-application和中cat-application。但是,您需要交付两个应用程序以及所需的所有依赖项Cat Dog.

\n