gpt4 book ai didi

java - 如何消除这个具体例子中的开关

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:44:36 25 4
gpt4 key购买 nike

我有一个 Controller 方法,它从请求中获取数据,并根据请求中的主题变量决定调用一个函数。 (对于项目需要,我不能为每个主题变量使用单独的 Controller 方法)

目前我使用了 switch,但我认为它违反了开闭原则(因为每次添加新类型的主题我都必须添加新的 case 来切换)并且设计不好,我该如何重构这段代码?

 Subject subject = ... //(type of enum)
JSONObject data = request.getData("data");

switch(subject) {

case SEND_VERIFY:
send_foo1(data.getString("foo1_1"), data.getString("foo1_2"));
break;

case do_foo2:
foo2(data.getInt("foo2_b"), data.getInt("foo2_cc"));
break;

case do_foo3:
do_foo3_for(data.getString("foo3"));
break;

// some more cases

}

最佳答案

虽然我不确定这个代码片段违反了哪条 OO 原则,但确实有更可靠的方法来实现逻辑:将每个枚举值的处理绑定(bind)到枚举类。

您需要将处理概括为一个接口(interface):

public interface SubjectProcessor
{
void process(JSONObject data);
}

并为每个枚举值创建具体实现:

public class SendVerifySubjectProcessor implements SubjectProcessor
{
@Override
public void process(JSONObject data) {
String foo1 = data.getString("foo1_1");
String foo2 = data.getString("foo1_2");
...
}
}

一旦你有了类层次结构树,你就可以将每个枚举值关联到一个具体的处理器

public enum Subject
{
SEND_VERIFY(new SendVerifySubjectProcessor()),
do_foo2(new Foo2SubjectProcessor()),
...
private SubjectProcessor processor

Subject(SubjectProcessor processor) {
this.processor = processor;
}

public void process(JSONObject data) {
this.processor.process(data);
}
}

这消除了 Controller 中 switch 语句的需要:

 Subject subject = ... //(type of enum)
JSONObject data = request.getData("data");
subject.process(data);

编辑:

按照好的评论,您可以使用 java.util.function.Consumer 功能接口(interface)而不是自定义 SubjectProcessor 接口(interface)。您可以决定是编写具体类还是使用 lambda expr 构造。

public class SendVerifySubjectProcessor implements Consumer<JSONObject>
{
@Override
public void accept(JSONObject data) {
String foo1 = data.getString("foo1_1");
String foo2 = data.getString("foo1_2");
...
}
}

public enum Subject
{
SEND_VERIFY(data -> {
String foo1 = data.getString("foo1_1");
String foo2 = data.getString("foo1_2");
...
}),

...
private Consumer<Subject> processor

Subject(Consumer<Subject> processor) {
this.processor = processor;
}

public void process(JSONObject data) {
this.processor.accept(data);
}
}

关于java - 如何消除这个具体例子中的开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48364480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com