Java 用动态构造函数替换开关
知道存储是一个接口,StorageXX是它的实现,我想知道是否有可能替换以下代码Java 用动态构造函数替换开关,java,Java,知道存储是一个接口,StorageXX是它的实现,我想知道是否有可能替换以下代码 Storage storage; switch (storageType) { case "list": storage = new StorageList(); break; case "map": storage = new StorageMap(); break; case "db": storage =
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,您可以将构造函数存储在映射中并跳过反射。看这个。谢谢!!!我正在看教程。我已经将德瑞克的答案标记为正确答案,因为他更快,但你的答案同样有用。谢谢!!!我正在看教程。我已经把德瑞克的答案标记为正确答案,因为他更快,但你的答案同样有用