我有一个快速而简单的问题。我习惯于让每个班级都“最终”,除非当然需要由另一个班级延长。
这是一个坏习惯吗?一个好习惯?它甚至重要吗? 我理解修饰符对类的影响。
提前多多感谢!
编辑: 这是一个示例代码。任何其他类都不会扩展此类。
public final class Application {
/**
* Starts the application.
*
* @param arguments arguments provided from command-line
*/
public static void main(String[] arguments) {
LaunchUtilities util = new LaunchUtilities(new EventHandler());
try {
util.addListener(43594);
} catch (IOException ioe) {
Logger.getLogger(Application.class.getName()).log(Level.SEVERE, "Could not bind a port to a listener!", ioe);
}
util.start();
}
}
答案 0 :(得分:8)
程序员(甚至Java大师)对此持不同意见。
设计Java Collections库的Josh Bloch,java.Math,assert
,并且是Google的首席Java架构师(或者在他们雇用Gosling之前),他的一本书“Effective Java”专门用于这个问题。我跟他要说的一样:
第17项:继承的设计和文件,否则禁止它
他指出,不为其设计的子类通常会导致灾难。
此外,继承设计很昂贵。
你总是可以改变主意并做出非决定性的事情。你不能做出最后的决定,而不是最终的。
阅读“有效的Java”,它使这一论点更加引人注目。它还将使您成为更好的程序员。
答案 1 :(得分:7)
这是一个好习惯。将最终类更改为非最终类不应该破坏任何代码。将非最终类更改为final可能会破坏某些代码。
答案 2 :(得分:7)
我会说坏习惯,原因如下:
例如:
public static void main(String[] args) {
final Fruit mockFruit = Mockito.mock(Fruit.class);
}
private static final class Fruit {
}
......会产生......
Exception in thread "main" org.mockito.exceptions.base.MockitoException:
Cannot mock/spy class org.foo.Foo$Fruit
Mockito cannot mock/spy following:
- final classes
- anonymous classes
- primitive types
当然,有最终确定类的有效方案。例如,您的类是不可变的。
答案 3 :(得分:5)
我会说这是一个坏习惯,因为这意味着你没有考虑决定。不做最终决定的重点是你可以在不改变原始代码的情况下继承并进行更改 。你打破了这个。
答案 4 :(得分:2)
您的问题没有准确的答案。这取决于你所写的课程的目的是什么。有些本来应该是最终的,而有些则不应该,除非您明确要求禁止继承。
如果您只是自己编程,那么我认为这不会产生任何影响,您每次知道或者需要子类化时都会删除final
修饰符。
总结final
一个类的修饰符,通常暗示其他人应该如何使用你的课程,而不是真正的好/坏习惯。
答案 5 :(得分:0)
它对HotSpot没有影响,但我不确定其他运行时系统。我从不使用它,因为它似乎没用。虽然变量中的final(在HotSpot中也没有效果)可以阻止你改变你不想要的值,但你真的没有对类的担忧。
但是,它曾经在HotSpot中很重要。对于像Android和Dalvik这样的东西可能很重要。答案 6 :(得分:0)
总的来说,这不是一个好主意。如果课程仅限于您的项目,则可以这样做。当你看到需要扩展一些类时,他总是可以使它们成为非最终类。