【问题标题】:Take final parameters from interface to generated method stubs in implementation将最终参数从接口获取到实现中生成的方法存根
【发布时间】:2021-02-06 12:41:25
【问题描述】:

我将“final”关键字用于方法参数,例如 C/C++ 中的“const”关键字,即使它在 JAVA 中的含义与 C/C++ 中的含义不是 100% 相同。我这样做主要是为了轻松区分输入参数和输出参数。喜欢这里:

interface Test
{
   public void myMethod(final int input1, final float input2, SomeResults output);
}

当我创建接口(或抽象类)的实现并让 eclipse 生成重载方法时,eclipse 将省略所有“最终”关键字,这真的很糟糕。 Java-Editor 设置的 SaveActions-Part 中有一个选项,但我可以强制 eclipse 在任何可能的地方使用“final”,这绝对不是我的意图。如何强制 Eclipse 不忽略接口方法或抽象方法中的“最终”关键字,并将它们放在实现和子类的生成方法存根中?

【问题讨论】:

  • 它不仅与 const “不是 100% 相同”,而且差异更大。作为调用者,它实际上根本没有给你额外的保证。它唯一阻止的是在方法中重新分配参数,但这对调用者来说是不可见的。
  • 另外,请注意,无论如何,原语总是按值传递:stackoverflow.com/questions/40480/…(引用也是如此,但这不太明显)
  • 另请注意,在 Java 中使用 out-parameters 并不是真正的习惯用法,尤其是对于 void 函数 - 为什么不使用返回值?
  • 如前所述,我使用“final”关键字只是为了阐明参数是“纯输入”变量。我知道原语将始终按值传递。

标签: java eclipse


【解决方案1】:

如何强制 Eclipse 不忽略接口方法或抽象方法中的 final 关键字,并将它们放在实现和子类的生成方法存根中?

我认为这是不可能的……除非你愿意修改 Eclipse。


恐怕你所做的没有任何效果。

如上所述,我使用final 关键字只是为了阐明参数是“纯输入”变量。我知道原语将始终按值传递。

final 不是这个意思。

  1. 所有参数都是“纯输入”......在它们按值传递的意义上。 Java 中没有“out”参数这样的东西。

  2. 相反,如果参数的类型是引用类型,则声明它final 不会阻止方法体改变实际参数。换句话说,它不会阻止方法体使用参数来模拟一个“out”参数。

  3. 在Java 中,在抽象方法声明器中将形参声明为final 没有任何意义。仅当方法声明符后跟方法体时,它才有意义。 (那么这意味着该变量不能被分配。)因此,如果一个工具(例如 Eclipse 存根生成器)在前一个上下文中对 final 赋予任何含义,这将是值得怀疑的。

我的建议是不要将这个(Java 设计者)无意的含义放在final 上,无论是在接口中还是在类中。如果你想表达“这不是一个”out“参数,要么在javadocs中做,要么发明一个自定义注释来表达它。(在后一种情况下,你可能会实现一个静态检查器来确保方法体不会改变参数对象。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多