【问题标题】:Proper use of final [duplicate]正确使用final [重复]
【发布时间】:2013-02-01 17:50:54
【问题描述】:

可能重复:
Java final modifier

这只是一个关于偏好的小问题。 final修饰符的正确用法是什么?

我注意到,从源到源,我比其他人更倾向于使用它。我把它用于方法的参数、方法中的变量以及我所能做的。这是必要的还是我做得过火了?

参考:

private final int x;
private final int y;
private final int id;
private final int width;
private final int height;

public Widget(final int id, final int x, final int y, final int width, final int height) {
    this.id = id;
    this.x = x;
    this.y = y;
    this.xmod = x;
    this.ymod = y;
    this.width = width;
    this.height = height;
}

【问题讨论】:

  • 你能分享一些例子吗?
  • 我认为您应该仅在必要时使用final。像任何东西一样,你不应该滥用它。

标签: java final


【解决方案1】:

是的,你做得太过分了。从历史上看,这可能会导致一些优化——例如final 方法可以更容易地内联——但是现在,无论您是否实际将方法标记为 final,大部分优化都已完成。

您仍应使用 final 的地方是类中的大多数字段、不应扩展或不扩展的类、不希望被覆盖的方法以及需要引用的局部变量在匿名内部类中。

特别是,在局部变量和不会被匿名内部类包装的方法参数上这样做是过分的。

【讨论】:

  • +1 我同意过度使用会导致混乱,尤其是在方法参数和局部变量上。 final 通常也没有运行时影响 ibm.com/developerworks/java/library/j-jtp1029/index.html
  • 投反对票的人愿意解释一下吗?
  • 可能有人喜欢最后的混乱。我知道有人将 final 放在所有变量上。
【解决方案2】:

我会说任何永远不会改变或覆盖的字段、类或方法都应该是最终的。这使其线程安全并允许编译器和虚拟机进行优化。它还阐明了您作为程序员的意图,并告诉其他开发人员价值永远不会改变,因此如果他们正在寻找复杂性,他们可以寻找其他地方。

好文章在这里: http://www.javapractices.com/topic/TopicAction.do?Id=23

【讨论】:

    【解决方案3】:

    我会说,当您不希望变量在初始化后被更改,或者如果您不希望类被子类化或方法被覆盖但子类时,您应该使用“final”。关于编译器优化,我认为“final”关键字的使用在某种程度上会有所帮助,但我只是读到了这个:

    一个常见的误解是将类或方法声明为 final 通过允许编译器直接插入 方法内联,无论它被调用。实际上编译器无法 这样做是因为该方法是在运行时加载的,可能不是 与刚刚编译的版本相同。只有运行时 环境和 JIT 编译器有确切的信息 类已经加载,并且能够做出更好的决定 何时内联,方法是否为最终方法。

    http://en.wikipedia.org/wiki/Final_(Java)

    【讨论】:

      【解决方案4】:

      如果 Java 是今天设计的,所有的局部变量和方法参数默认都是 final 的。

      很遗憾,由于语言不这样做,我们应该手动执行吗?

      这似乎太繁琐了。如果我们不做,而且似乎没有什么大问题,那我们可以偷懒不做。

      【讨论】:

        【解决方案5】:

        不必每次都将变量设为final。当你想改变这些变量的值时,它可能会变得很头疼。

        我认为,只有当变量 final 是univarsely 常量或者您认为不应该更改时,才应该对变量 final 进行标记。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-16
          • 1970-01-01
          • 1970-01-01
          • 2015-01-04
          • 1970-01-01
          • 1970-01-01
          • 2011-12-31
          • 2014-05-29
          相关资源
          最近更新 更多