当前位置: 首页 > 面试题库 >

Java中没有switch语句的工厂

轩辕弘雅
2023-03-14
问题内容

我正在尝试构建工厂对象,但是很难找到一种用Java实现它的好方法。

我正在编写的应用程序用于处理各种格式的文件,因此有一个CodecInterface,适用于用于读写文件的所有类。假设它定义了以下方法。这些文件中的每一个都有一个唯一的人工指定的ID字符串,用于对编码器\解码器进行ID识别。

String read();
void write(String data);
String getID();

工厂类将具有用于创建这些编解码器类实例的create方法。我想方法签名看起来像这样。

static CodecInterface CodecFactory.create(String filename, String codecid, String args);

文件名是要读取/写入的文件的名称,编解码器是指示要使用哪种编解码器的唯一ID。args参数是传递给正在生成的解码器/编码器对象的参数字符串。它的返回应该是所请求的编解码器对象的实例。

我见过的所有Factory示例通常都在create方法内部包含一个switch语句,该语句根据ID创建对象实例。我想避免这样做,因为这似乎不是“正确”的方法,这也意味着除非您修改create方法,否则列表几乎是固定的。理想情况下,我想使用像字典(由编解码器ID索引)之类的东西,其中包含可用于创建所需的编解码器类实例的东西(我将称之为神秘类ClassReference)。再次使用一些准Java代码,这就是我作为create方法的主体所想的。

static Dictionary<String, ClassReference>;

static CodecInterface CodecFactory.create(String filename, String codecid, String args);
{
    ClassReference classreference;

    classreference = codeclibrary(codecid);

    return classreference.instanceOf(args);
}

ID的字典很简单,但是我不知道应该使用什么ClassReference。类引用应该允许我创建所需类的实例,如上例所示。

从网上看,类方法和instanceOf似乎都朝着正确的方向发展,但是我还没有发现任何可以将两者结合在一起的东西。更为复杂的是,要创建的对象的构造函数将带有参数。

我应该看的任何提示将不胜感激。

提前致谢。

感谢大家的建议。最后,我从您的所有建议中总结了一些建议,并提出了以下建议,这些建议似乎很奏效。

请注意,我已经省略了很多“健全性/错误检查”代码以炫耀重要的位。

import java.lang.reflect.Constructor;
import java.util.HashMap;

public class CodecFactory
{
    private static HashMap<String, Class<? extends CodecInterface>> codecs;

    static
    {        
        codecs = new HashMap<String, Class<? extends CodecInterface>>();

        //Register built-in codecs here
        register("codecA", CodecA.class);
        register("codecB", CodecB.class);
        register("codecC", CodecC.class);
    }

    public static void register(String id, Class<? extends CodecInterface> codec)
    {
        Class<? extends CodecInterface> existing;

        existing = codecs.get(id);        
        if(existing == null)
        {
          codecs.put(id, codec);
        }
        else
        {
          //Duplicate ID error handling
        }
    }

    public static CodecInterface create(String codecid, String filename, String mode, String arguments)
    {
        Class<? extends CodecInterface> codecclass;
        CodecInterface codec;
        Constructor constructor;

        codec = null;

        codecclass = codecs.get(codecid);
        if(codecclass != null)
        {
          try
          {
            constructor = codecclass.getDeclaredConstructor(String.class, String.class, String.class, String.class);
            codec = (CodecInterface)(constructor.newInstance(codecid, filename, mode, arguments));
          }
          catch(Exception e)
          {
            //Error handling for constructor/instantiation
          }
        }

        return codec;
    }
}

问题答案:

尝试这样的事情:

public class CodecFactory {
    final private static Map<String, Class<? extends CodecInterface>> codecLibrary;

    static {
        codecLibrary = new HashMap<String, Class<? extends CodecInterface>>();
        codecLibrary.put("codec1", Codec1.class);
        //...
    }

    static CodecInterface create(String filename, String codecid, String args) throws InstantiationException, IllegalAccessException {
        Class<? extends CodecInterface> clazz;

        clazz = codecLibrary.get(codecid);

        CodecInterface codec = clazz.newInstance();

        codec.setArgs(args);
        codec.setFilename(filename);

        return codec;
    }
}


 类似资料:
  • 本文向大家介绍Java中的Switch语句,包括了Java中的Switch语句的使用技巧和注意事项,需要的朋友参考一下 switch语句允许针对值列表对变量进行相等性测试。每个值称为一个案例,并针对每种情况检查要打开的变量。首先让我们看一下语法- 以下是适用于Java中switch语句的规则- switch语句中使用的变量只能是整数,可转换整数(字节,短整数,字符),字符串和枚举。 开关内可以有任

  • 主要内容:switch 语句格式,嵌套 switch 语句,if 语句和 switch 语句的区别if…else 语句可以用来描述一个“二岔路口”,我们只能选择其中一条路来继续走,然而生活中经常会碰到“多岔路口”的情况。 switch 语句提供了 if 语句的一个变通形式,可以从多个语句块中选择其中的一个执行。 switch 语句格式 switch 语句是 Java 的多路分支语句。它提供了一种基于一个表达式的值来使程序执行不同部分的简单方法。因此,它提供了一个比一系列 if-else-if

  • 问题内容: 我正在学习Swift的语法,想知道为什么下面的代码无法按我期望的那样工作: 我想每次将数字除以3(3、6、9、12等)时都打印Fizz,并且每次将其除以5时都打印Buzz,那么缺少哪一块拼图? 注意:我确实使用以下方法解决了问题: 我想知道如何使用Switch解决此问题。谢谢。 问题答案: FizzBu​​zz游戏的通常规则 是用“ Fizz”替换每个3的倍数,用“ Buzz”替换每个

  • switch 语句可以替代多个 if 判断。 switch 语句为多分支选择的情况提供了一个更具描述性的方式。 语法 switch 语句有至少一个 case 代码块和一个可选的 default 代码块。 就像这样: switch(x) { case 'value1': // if (x === 'value1') ... [break] case 'value2':

  •  使用 switch 语句可以更简洁地实现 if ~ else if 的结构。格式如下。 switch(base_expression) { casecondition_expression1: casecondition_expression2: : : default: : : }  写在 base_expression 位置的表达式会在刚开始时被求值。switch 后面的语句块中的 case

  • 我应该如何做这个switch语句,应该纠正什么?? 我得到错误消息:我发现的元素比预期的要多,如下所示: