打算开发Java Web服务,该服务至少应处理10个@QueryParam
。也就是说,假设我有10个查询参数,我将以90个if-else语句(我认为,最少)来尝试构造所有可能的编译。
例如:
public Response getMethod(
@QueryParam("a") List<String> a,
@QueryParam("b") List<String> b,
@QueryParam("c") List<String> c,
@QueryParam("d") List<String> d,
@QueryParam("e") List<String> e
// ... etc
){
if (a != null && b == null && c == null ...)
{
// bla bla bla - 1
}
else if (a != null && b != null && c == null ...)
{
// bla bla bla - 2
}
....
我的问题是如何应对这种情况?即是否有任何快捷方式/模式可以最大限度地减少工作量?
参考方案
总体思路是构建映射功能:输入排列=>结果处理器。
为此,请使用10+个布尔条件(a!= null,b!= null ...)作为位字段来构建10位密钥。
// assume a,b,c,d...j are in scope and null or not-null
int inK = ((((a != null) ? 1 : 0) << 0 |
((b != null) ? 1 : 0) << 1 |
...
((j != null) ? 1 : 0) << 9))
// so now inK is a 10-bit number where each bit represents whether the
// corresponding parameter is present.
接下来...假设构建一个映射,其中单个条目的值是代表任何键的“结果处理器”的对象。假设此对象实现了OutcomeProcessor。
HashMap<Integer,OutcomeProcessor> ourMap;
每个结果处理器值都有一个作为掩码的键值。例如一个钥匙
值0x14表示参数“ c”(4)和“ e”(0x10)必须
出现以调用处理器。
OutcomeProcessor需要访问所需的任何参数,但
接口是通用的,因此可以将参数提供为列表(在这种情况下为列表)或更一般的集合。
因此,要构建ourMap
,请假设您知道映射和处理器实现:
// first outcome processor (an instance of `OutcomeProcessor1` needs 'a' and 'c' input parameters
ourMap.put(0x5, new OutcomeProcessor1());
// second outcome processor (needs 'a' and 'd')
ourMap.put(0x9, new OutcomeProcessor2());
// so you'll see that if the input is 'a','c' and 'd' then both processors
// are invoked.
// repeat for all possible outcome processors
接下来将遮罩应用于地图
for (Map.Entry<Integer, OutcomeProcessor> entry : ourMap.entrySet()) {
int mask = entry.getKey();
if ((mask & inK) == mask) {
// invoke processor
entry.getValue().method(<list of parameters>);
}
}
真的很简单。
此方法的一些属性:
输入排列的单个实例(例如,存在a&f&h)可以(如果需要)产生多个结果。
可以从多个输入排列中调用单个结果(例如,结果处理器可能需要b&c(0x6),输入是(a,b,c,d)或(b,c,f)-两种输入情况都可以调用此处理器。)
您可能会变得更加复杂,并让OutcomeProcessor返回清除其服务位的结果。并继续循环直到所有参数得到服务。
我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…
java:继承 - java有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…
Java:BigInteger,如何通过OutputStream编写它 - java我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…
Java:从类中查找项目名称 - java仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…
JAVA 8具有任何匹配属性的对象的过滤器列表 - java我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…