【问题标题】:Avoiding if-else with Protobuf generated enums using visitor pattern使用访问者模式避免使用 Protobuf 生成的枚举的 if-else
【发布时间】:2020-09-23 06:31:15
【问题描述】:

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

oneof sample {
     string str = 1;
     int64 i = 2;
     ... (many other fields inside oneof)
}

自动生成的 java 代码将为名为 SampleCasesample 生成枚举,其中包含

enum SampleCase {
    STR(1)
    I(2)
    ...
}

现在在应用程序端,我想根据枚举SampleCase 的类型调用不同对象的方法。一种天真的方法是做 if-else:

if(case == SampleCase.STR) {
    obj1.call();
} else if(case == SampleCase.I) {
    obj2.call();
} else if(....)
...

访问者模式似乎很适合这里避免 if-else。我查看了this,但这需要修改枚举,而且我无权修改 protobuf 生成的枚举。任何方法如何进一步进行?

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

【问题讨论】:

  • Switch case 支持enum types
  • @jaco0646 我正在寻找一个通用的解决方案。我的代码中有很多地方都有这个 if-else。拥有 switch case 并不能真正解决任何问题。

标签: java design-patterns enums protocol-buffers


【解决方案1】:

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

当您收到 Proto 生成的对象时,您可以在一个地方将它们转换为域对象,之后您可以在其他任何地方使用访问者模式,而不是 switch case / if-else。

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

这也将使您能够将您的所有类与原型类解耦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多