Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Protobuf生成的枚举使用访问者模式避免if-else_Java_Design Patterns_Enums_Protocol Buffers - Fatal编程技术网

Java 使用Protobuf生成的枚举使用访问者模式避免if-else

Java 使用Protobuf生成的枚举使用访问者模式避免if-else,java,design-patterns,enums,protocol-buffers,Java,Design Patterns,Enums,Protocol Buffers,假设我有一个原型对象,如下所示: oneof sample { string str = 1; int64 i = 2; ... (many other fields inside oneof) } 自动生成的java代码将为名为sample的SampleCase生成枚举,其中包含 enum SampleCase { STR(1) I(2) ... } 现在在应用程序方面,我想根据enumSampleCase的类型调用不同对象上的方法。一

假设我有一个原型对象,如下所示:

oneof sample {
     string str = 1;
     int64 i = 2;
     ... (many other fields inside oneof)
}
自动生成的java代码将为名为
sample
SampleCase
生成枚举,其中包含

enum SampleCase {
    STR(1)
    I(2)
    ...
}
现在在应用程序方面,我想根据enum
SampleCase
的类型调用不同对象上的方法。一种天真的方法是,如果没有其他方法:

if(case == SampleCase.STR) {
    obj1.call();
} else if(case == SampleCase.I) {
    obj2.call();
} else if(....)
...
访客模式似乎很适合在这里避免。我查看了,但这需要修改枚举,我没有权限修改protobuf生成的枚举。有什么办法可以继续吗


我也愿意接受任何其他可以解决这个问题的设计模式。

一个避免的选择,引用您的话,“我的代码中很多地方都有这个if-else”。是创建实现访问者模式的自己的域对象

当您接收到原始生成的对象时,您可以在一个位置将它们转换为域对象,然后您可以在其他任何地方使用访问者模式,而不是切换cases/if-else

无论如何,您将不得不依赖于switch/if-else情况,但这将集中在一个转换位置,而不是整个代码中


这也将使您能够将您的所有应用程序与proto类解耦。

Switch case支持。@jaco0646我正在寻找一个通用的解决方案。我的代码中很多地方都有if-else。有开关箱并不能解决任何问题。