【问题标题】:write parameter names in method call在方法调用中写入参数名称
【发布时间】:2016-02-12 15:51:15
【问题描述】:

我想在调用方法时写下参数方法的名称,而不仅仅是给出参数本身。示例:

public exampleMethod(boolean xWasDone) {}

已知的调用方式是:

exampleMethod(true);

有没有办法通过显式命名参数来调用它?像这样?:

exampleMethod(xWasDone: true);

我认为后者更具可读性,因此会对这样编写我的调用的正确方式感兴趣。

【问题讨论】:

  • 您可以将 xWasDone 的值保存在它自己的变量中(布尔 xWasDone = true)并像这样调用方法:exampleMethod(xWasDone)
  • 不,它不能用 Java 完成。
  • 如果您有多个参数,您可以使用方法签名,采用(n 不可变)Map
  • 如果您坚持,在这种特殊情况下,也许Boolean.TRUE 对您来说更具可读性。但这对我来说很难看(而且它是一个对象而不是原始对象)。
  • 您可以将 cmets 放入您的代码 exampleMethod(/*xWasDone*/ true);

标签: java


【解决方案1】:

这可能是一个迟到的回应,但我今天刚刚遇到类似的事情,想让新读者探索一下。

尽管 java 不 支持这一点,但我相信这会增加代码的可读性。如果您真的有兴趣使用它,可以探索默认支持此功能的 IntelliJ IDE。

Eclipse 讨论引入此功能:https://bugs.eclipse.org/bugs/show_bug.cgi?id=529011

我知道这件事的链接:https://youtu.be/yVzi3wuTUE4?t=946

快乐狩猎。

如果需要任何更正,请通知我。

【讨论】:

    【解决方案2】:

    已经有很多完全有效的答案,所以我不会重复任何人已经说过的任何内容,但是您可能会认为可以接受的一种方法是将变量赋值作为参数:

    String name = "George";
    boolean age = 57;
    boolean iq = 66;
    
    Person person1 = new Person(name, age, iq);
    Person person2 = new Person(name = "Beth", age = 65, iq = 69);
    

    稍微过分简化的情况,在这里绝对没有必要,但在更复杂的情况下(比如你必须在脑海中保持秩序的 5 个类似的布尔值),这会有所帮助:

    draw1(g2, false, true, false, true);
    

    draw1(g2, outline = false, bold = true, italic = false, underline = true);
    

    注意:顺序仍然是相关的(例如,您不能切换粗体和斜体)但至少您可以很容易地看到哪个参数做了什么。

    【讨论】:

      【解决方案3】:

      Java支持此语法。

      可以说它是不需要的,因为函数签名中的参数顺序在 Java 中是强制执行的。

      另外,您应该注意函数 overloading 在 Java 中受支持,其中多个函数可能具有相同的名称但参数数量不同。这意味着您不能省略任何指定的输入,以避免无意中调用另一个重载函数。

      【讨论】:

      • Oracle PL/SQL 也具有重写功能,并且允许通过名称引用参数以及可选参数。你觉得这有什么问题?
      • 我不熟悉 Oracle PL/SQL。按名称引用参数是强制性的吗?以及如何指定可选参数?
      • 允许同时按参数顺序和名称引用,甚至是混合方法 (call(1, 2, c => 3))。省略的参数是默认的。但我意识到这可能不是一个很好的例子,因为结果相当混乱。
      【解决方案4】:

      如果它真的只是关于可读性,你可以这样编写方法调用:

      someMethod(/*param1*/ true, /*param2*/ 133.7, /*param3*/ "foobar");
      

      但这真的不应该是必要的!例子:你有这个方法

      public void setPersonData(String gender, int age, String name) {
          ...
      }
      

      你可以这样调用方法:

      String str1 = "male";
      int int1 = 56;
      String str2 = "Rudolf";
      setPersonData(str1, int1, str2);
      

      在这种情况下你是对的,它不是很可读!但是如果你这样写:

      String gender = "male";
      int age = 56;
      String name = "Rudolf";
      setPersonData(gender, age, name);
      

      您不会有任何可读性问题!

      【讨论】:

      • 我认为按名称传递参数的最重要原因不是可读性,而是正确性。当函数接受 5+ 个参数时,编码器很可能会不小心将它们放错位置,从而产生逻辑错误。
      【解决方案5】:

      我也有(遇到过)布尔值的这个问题。您提出的语法在 Java 中是不可能的,但 Java 允许类似的东西。你可以切换到enums

      提高可读性:使用枚举而不是布尔值

      定义一个枚举

      enum Status { DONE, TODO };
      

      在你的方法中使用它

      public exampleMethod(Status status) 
      {
          if (status == DONE) ...
      }
      

      在你的方法调用中

      exampleMethod(Status.DONE);
      

      除了明显提高可读性之外,这还允许更轻松的重构和可扩展性,例如在需要其他状态时。

      【讨论】:

        【解决方案6】:

        如果您关心可读性,请考虑使用以下方法之一:

        • 定义一个您将使用的布尔变量:

          boolean wasDone = true;
          exampleMethod(wasDone);
          
        • 定义一个你将使用的常量:

          private static boolean WAS_DONE= true;
          ...
              exampleMethod(WAS_DONE);
          
        • 避免使用布尔参数,而是使用枚举:

          exampleMethod(Status.WAS_DONE);
          

        【讨论】:

          【解决方案7】:

          Java 不支持命名参数,这正是你要找的。​​p>

          但是,您可以按照本文所述的命名参数的优雅惯用方法进行编程 Named Parameter idiom in Java

          在 Java8 中,您可以像这样访问方法的参数 named_parameters_in_java_8;但这远不是你真正想要达到的目标,对吧?

          【讨论】:

            【解决方案8】:

            这在 Java 中是不可能的。但是,您可以在其他地方定义和初始化参数,然后使用此参数调用它。但如果背后没有业务逻辑,我不会这样做。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-01-11
              • 1970-01-01
              • 2013-01-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多