Java 用动态构造函数替换开关

Java 用动态构造函数替换开关,java,Java,知道存储是一个接口,StorageXX是它的实现,我想知道是否有可能替换以下代码 Storage storage; switch (storageType) { case "list": storage = new StorageList(); break; case "map": storage = new StorageMap(); break; case "db": storage =

知道存储是一个接口,StorageXX是它的实现,我想知道是否有可能替换以下代码

Storage storage;
switch (storageType) {
    case "list":
        storage = new StorageList();
        break;
    case "map":
        storage = new StorageMap();
        break;
    case "db":
        storage = new StorageDB();
        break;
    default:
        throw new UnsupportedStorageTypeException();
}
。。。通过采用字符串参数(storageType)的存储的“动态构造函数”,在每种情况下返回我想要的实例

存储是否应该是抽象类并不重要


如果可能的话,我宁愿避免使用任何switch语句。

您可以创建从storageType到类的映射

Map<String, Class<? extends Storage>> map = new HashMap<>();
map.put("list", StorageList.class);
map.put("map", StorageMap.class);
map.put("db", StorageDB.class);

您可以创建从storageType到类的映射

Map<String, Class<? extends Storage>> map = new HashMap<>();
map.put("list", StorageList.class);
map.put("map", StorageMap.class);
map.put("db", StorageDB.class);

你可以使用工厂模式

class StorageFactory
{
  public static Storage getStorage(String type)
  {
    if ( type.equals("list") )
      return new StorageList();
    else if ( type.equals("map") )
      return new StorageMap();
    else if ( type.equals("db") )
      return new StorageDb();

    throw new IllegalArgumentException();
  }
}
要创建存储列表,请执行以下操作:

Storage storage = StorageFactory.getStorage("list");

你可以使用工厂模式

class StorageFactory
{
  public static Storage getStorage(String type)
  {
    if ( type.equals("list") )
      return new StorageList();
    else if ( type.equals("map") )
      return new StorageMap();
    else if ( type.equals("db") )
      return new StorageDb();

    throw new IllegalArgumentException();
  }
}
要创建存储列表,请执行以下操作:

Storage storage = StorageFactory.getStorage("list");

是你应该调查的事情。它正是你想要的。

是你应该研究的东西。它完全符合您的要求。

如果您将
StorageDB
重命名为
StorageDB
,则可以动态生成名称,并使用反射。从另一个问题中可以找到足够适合您需要的名称吗?(需要Java 8)的可能副本如果将
StorageDB
重命名为
StorageDB
,则可以动态生成名称,并使用反射。从另一个问题中可以看出是否足够适合您的需要?(需要Java 8)您刚刚用多个
if
语句替换了
switch
语句。这有什么不同吗?好吧,我知道他反对
开关
而不是
if
语句,我向他展示了一个模式。我不认为我应该为此投反对票,但没关系。同意@Dherik。正如我所说的“如果可能的话,避免转换”,你不应该得到一张不投票。这正是我需要的谢谢你刚才用多个
if
语句替换了一个
switch
语句。这有什么不同吗?好吧,我知道他反对
开关
而不是
if
语句,我向他展示了一个模式。我不认为我应该为此投反对票,但没关系。同意@Dherik。正如我所说的“如果可能的话,避免转换”,你不应该得到一张不投票。这正是我需要的谢谢如果使用Java8,您可以将构造函数存储在映射中并跳过反射。如果使用Java8,您可以将构造函数存储在映射中并跳过反射。看这个。谢谢!!!我正在看教程。我已经将德瑞克的答案标记为正确答案,因为他更快,但你的答案同样有用。谢谢!!!我正在看教程。我已经把德瑞克的答案标记为正确答案,因为他更快,但你的答案同样有用