我读到那是为了制作classimmutable在Java中,我们应该这样做,不提供任何setter将所有字段标记为私有(private)使类(class)成为final类为什么需要第3步?为什么要标记类final? 最佳答案 如果你不标记类final,我可能会突然让你看似不可变的类实际上是可变的。例如,考虑以下代码:publicclassImmutable{privatefinalintvalue;publicImmutable(intvalue){this.value=value;}publicintgetValue(){retu
我阅读了关于ConcurrentHashMap的JDK源代码。但是下面的代码让我很困惑:publicbooleanisEmpty(){finalSegment[]segments=this.segments;...}我的问题是:“this.segments”被声明:finalSegment[]segments;所以,在这里,在方法的开头,声明了一个相同类型的引用,指向相同的内存。作者为什么要这样写?他们为什么不直接使用this.segments呢?有什么原因吗? 最佳答案 这是涉及volatile变量的无锁代码的典型习语。在第一行,
我阅读了关于ConcurrentHashMap的JDK源代码。但是下面的代码让我很困惑:publicbooleanisEmpty(){finalSegment[]segments=this.segments;...}我的问题是:“this.segments”被声明:finalSegment[]segments;所以,在这里,在方法的开头,声明了一个相同类型的引用,指向相同的内存。作者为什么要这样写?他们为什么不直接使用this.segments呢?有什么原因吗? 最佳答案 这是涉及volatile变量的无锁代码的典型习语。在第一行,
System.out被声明为publicstaticfinalPrintStreamout。但是您可以调用System.setOut()重新分配它。嗯?如果是final,这怎么可能?(同一点适用于System.in和System.err)更重要的是,如果您可以改变公共(public)静态最终字段,那么就final给您的保证(如果有)而言,这意味着什么?(我从未意识到也不期望System.in/out/err表现为final变量) 最佳答案 JLS17.5.4WriteProtectedFields:Normally,finalsta
System.out被声明为publicstaticfinalPrintStreamout。但是您可以调用System.setOut()重新分配它。嗯?如果是final,这怎么可能?(同一点适用于System.in和System.err)更重要的是,如果您可以改变公共(public)静态最终字段,那么就final给您的保证(如果有)而言,这意味着什么?(我从未意识到也不期望System.in/out/err表现为final变量) 最佳答案 JLS17.5.4WriteProtectedFields:Normally,finalsta
默认方法是我们Java工具箱中一个不错的新工具。但是,我尝试编写一个接口(interface)来定义toString方法的default版本。Java告诉我这是被禁止的,因为在java.lang.Object中声明的方法可能不是defaulted。为什么会这样?我知道有“基类总是获胜”的规则,所以默认情况下(双关语;),任何object方法的default实现都将被覆盖Object中的方法。但是,我认为规范中的Object方法不应该有异常(exception)。特别是对于toString,有一个默认实现可能非常有用。那么,Java设计者决定不允许default方法覆盖Object方法的
默认方法是我们Java工具箱中一个不错的新工具。但是,我尝试编写一个接口(interface)来定义toString方法的default版本。Java告诉我这是被禁止的,因为在java.lang.Object中声明的方法可能不是defaulted。为什么会这样?我知道有“基类总是获胜”的规则,所以默认情况下(双关语;),任何object方法的default实现都将被覆盖Object中的方法。但是,我认为规范中的Object方法不应该有异常(exception)。特别是对于toString,有一个默认实现可能非常有用。那么,Java设计者决定不允许default方法覆盖Object方法的
在Java中声明方法参数final是否有任何性能原因?如:publicvoidfoo(intbar){...}对比:publicvoidfoo(finalintbar){...}假设bar在foo()中只被读取而从未被修改。 最佳答案 final关键字不会出现在局部变量和参数的类文件中,因此不会影响运行时性能。它的唯一用途是澄清编码人员不更改变量的意图(许多人认为其使用的可疑原因),并处理匿名内部类。关于方法本身的final修饰符是否有任何性能提升存在很多争论,因为无论如何优化编译器都会在运行时内联这些方法,而不管修饰符是什么。在这
在Java中声明方法参数final是否有任何性能原因?如:publicvoidfoo(intbar){...}对比:publicvoidfoo(finalintbar){...}假设bar在foo()中只被读取而从未被修改。 最佳答案 final关键字不会出现在局部变量和参数的类文件中,因此不会影响运行时性能。它的唯一用途是澄清编码人员不更改变量的意图(许多人认为其使用的可疑原因),并处理匿名内部类。关于方法本身的final修饰符是否有任何性能提升存在很多争论,因为无论如何优化编译器都会在运行时内联这些方法,而不管修饰符是什么。在这
在Java类中,可以将方法定义为final,以标记该方法不能被覆盖:publicclassThingy{publicThingy(){...}publicintoperationA(){...}/**thismethoddoes@returnThatandisfinal.*/publicfinalintgetThat(){...}}这很清楚,它可能对防止意外覆盖或性能有所帮助——但这不是我的问题。我的问题是:从OOP的角度来看,我理解,通过定义方法final类设计器promises该方法将始终如所描述或暗示的那样工作.但通常这可能不受类作者的影响,如果方法正在做的事情更复杂,那么只需提