java - 基于前提条件创建新实例的最佳方法

标签 java

您好,我的问题是这个。假设您有一个定义转换器实现方式的接口(interface)。这个接口(interface)可以有一个方法 loadDocument() 和另一个 convert()。现在假设我们想要多个转换器,ConvertHTML2DOC、ConvertXML2HTML 等等,你明白了。

假设您在 2 个字符串中获得了需要转换的两种格式(无论您如何获得它们)。现在您需要创建一个转换器实例并转换文档。

我的问题是哪个更好:实际创建一个精心设计的 if 语句或通过 Class 类的反射加载类?为了证明我写了一个小例子来说明我的意思。在我的示例中,我有 2 个共享接口(interface)的类 P1 和 P2。我还创建了 50000 个来显示速度差异。事实证明,普通调用稍微快一些,但我认为在像我一开始提到的复杂示例中,通过 Class 方法创建类的好处是更方便,更易于维护。你有什么想法?

import java.util.*;

public class Test {
  public static void main(String[] args) {
    try {
      Random r = new Random();
      Date test1start = new Date();
      for (int i = 0; i<= 50000; i++){
        Printable p = (Printable)Class.forName("P"+(r.nextInt(2)+1)).newInstance();
        System.out.println(p.getString());
      }
      Date test1stop = new Date();
      Date test2start = new Date();
      for (int i = 0; i<= 50000; i++){
        Printable p;
        if (r.nextInt(2) == 0 ) {
           p = new P1();
        } else {
          p = new P2();
        }
        System.out.println(p.getString());
      }
      Date test2stop = new Date();
      System.out.println("Test with 'Class' invocation took "+(test1stop.getTime()-test1start.getTime())+" milliseconds.");
      System.out.println("Test with 'normal' invocation took "+(test2stop.getTime()-test2start.getTime())+" milliseconds.");
    } catch (Exception e) {
    }
  }
}

interface Printable {
  public String getString();
}

class P1 implements Printable {
  public String getString(){
    return "1";
  }
}

class P2 implements Printable {
  public String getString(){
    return "2";
}
  }

最佳答案

您一定要听从 Javier 的建议——注册工厂是解决这个问题的正确方法。我过去曾多次以这种方式实现它,用于格式转换或其他一些可扩展的基于“谓词”的工厂解决方案(例如,基于反射信息的自动 GUI 生成)。

不过,我建议在设计中添加一项 - 引入所有翻译人员都针对的通用域模型 (CDM)。假设您有格式 A、B 和 C,并且您需要支持每种格式之间的转换 - 您将获得所有排列:

  • A -> B
  • A -> C
  • B -> A
  • B -> C
  • C -> A
  • C -> B

随着格式数量的增加,您会得到爆炸式的转换!一个更好的主意是将每个转换分成两部分 - 让我们称之为导入器导出器。导入器将格式转换为通用域模型 (CDM),而导出器将 CDM 格式转换为某种格式。

作为例子,我们将A到B的转换分解成如下:

  • A --> CDM(这是进口)
  • CDM --> B(这是导出)

现在,当您想要添加一种新格式时,您只需要编写一个导入器和一个导出器,就可以获得与所有其他格式之间的转换!谈论可扩展性!它还允许您可以读取但不能写入的格式,反之亦然。

因此,解决方案是建立一个进口商工厂登记处和一个导出商工厂登记处。

关于java - 基于前提条件创建新实例的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/695841/

相关文章:

java - 使用内部类强制转换代理 Java 类

java - 解决二维数组中的 NxN 难题

java - Ant 构建的 Jar 程序看不到具有显式设置类路径的类

java - 从 Apache Http 客户端迁移到 OkHttp

java - 在 Eclipse 中排除库类

java - 如何将 url 作为路径参数传递?在 JAX-RS @Path 中

java - 使 ViewPager 的高度等于 PagerAdapter 中最高的项目

java - 在 IntelliJ 插件内创建类时将变量传递给模板

java - 使用Docker部署Java War

java - 将带有按钮的新行添加到 javafx tableview