【问题标题】:Guava Optional. How to use the correct番石榴 可选。如何正确使用
【发布时间】:2012-07-18 16:38:52
【问题描述】:

我有课

private class TouchCommand {
  private int action;
  private int x;
  private int y;
...

命令执行时,需要验证字段值——null/not null,并根据它产生纵向动作。我想使用 Google Guava 的 Options。

哪种解决方案是正确的? 这个:

public boolean executeCommand() {
  Optional<Integer> optionalAction = Optional.fromNullable(action);
  ...

或:

private class TouchCommand {
  private Optional<Integer> action;
  private Optional<Integer> x;
  private Optional<Integer> y;
...

鉴于对 parseAction 的调用也可能返回 null(或不存在):

TouchCommand touchCommand = new TouchCommand();
touchCommand.mAction = parseAction(xmlParser.getAttributeValue(namespace, "action"));
...

问题:

  1. 是否这样做:方法 parseAction(和类似方法)返回 Optional ?
  2. 是否这样做:类对象的字段 Optional ?
  3. 是否这样做:在检查类的字段时(假设它们可以为null)将它们转换为对象可选?

谢谢。

【问题讨论】:

    标签: java guava optional


    【解决方案1】:

    Guava 贡献者在这里...

    任何或所有这些都可以,但其中一些可能是矫枉过正。

    一般来说,正如this StackOverflow answer 中所讨论的,Optional 主要用于两件事:使null 的意思更清楚,以及在方法中返回值确保调用者处理“缺席”情况(使用null 更容易忘记)。我们当然不提倡在代码中的任何地方都用Optional 替换每个可为空的值——我们当然不会在 Guava 内部这样做!

    其中很多都必须由您决定——没有普遍的规则,这是一个相对主观的判断,而且我没有足够的背景来确定我会在你的位置上做什么——但基于什么您提供的上下文,我会考虑让方法返回 Optional,但可能不会更改任何其他字段或任何内容。

    【讨论】:

    • 我只是认为做一个类字段“可选”是不正确的。如果这也是正确的,那么(我认为)存储可以为null的值,比在Optional中转换每个时间值更容易,如果需要验证。
    • 我的意思是,这并不是说它不起作用。但是Optional 会带来自己的开销,这可能是不可取的。在这里优化可维护性和代码可读性确实要好得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多