这似乎是一个愚蠢的问题,但我不清楚如何在java代码中处理这个问题:
我有很多通过API与我的系统交互的设备。它们各有一种类型,例如电视,智能手机,笔记本电脑 我的代码需要根据此类型执行许多不同的操作。对于系统中的许多其他服务器来说就是这种情况 与每个设备相关的记录存储在数据库中,包括类型。
目前我正在做的是拥有一个带有每种类型引用的静态类,如下所示:
DeviceType.SMART_PHONE
然后我随处使用。每个项目都可能有这样的类。 因此它以以下方式使用:
if(device.getType().equals(DeviceType.SMART_PHONE){
// stuff happens
}
有时我会在使用它们的类中使用公共静态变量,因此在设备对象本身中。
这样的事情的最佳做法是什么?
答案 0 :(得分:2)
对于我来说,这看起来像策略模式,因为您为每个DeviceType
做了不同的事情。在这种情况下,您可以使用一个公共接口来执行stuff happens
(无论是什么)。例如:
// if you have java-8, this could be replaced with java.util.Consumer for example
interface Handler {
public void handle();
}
然后你可以创建所有需要的处理程序。
static class SmartPhoneHandler implements Handler {
public void handle(){
// handle smart phone logic here
}
}
您需要将这些注册到Map
:
Map<DeviceType, Handler> strategies = new HashMap<>(); // or EnumMap in case DeviceType is an enum
strategies.put(DeviceType.SmartPhone, new SmartPhoneHandler());
// all others like this
以后的用法是:
strategies.get(device.getType()).handle()
如果你需要一些参数作为handle方法的输入 - 你应该创建另一个名为StrategyContext
的持有者,它将输入所需的参数,例如:
static class StrategyContext {
private final int deviceId; // for example
// .... constructor/getters
}
因此您的handle
方法将更改为:
handle(StrategyContext context)
答案 1 :(得分:0)
我认为更好的解决方案是创建枚举&#39; DeviceType&#39;定义了所有类型。 通过这种方式,您可以确保这些静态决赛不会在项目的任何地方。 这也可以防止在整个项目中定义的与字符串常量相关的愚蠢的拼写错误或其他错误。