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)
...
}
现在在应用程序方面,我想根据enumSampleCase
的类型调用不同对象上的方法。一种天真的方法是,如果没有其他方法:
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。有开关箱并不能解决任何问题。