gpt4 book ai didi

java - 为什么 Java 中的包装器类是最终的?

转载 作者:搜寻专家 更新时间:2023-10-30 21:40:53 24 4
gpt4 key购买 nike

就像听起来一样简单。我需要扩展它们的功能,但我做不到。为什么它们被定义为最终的?

例子:

class MyInteger extends Integer
{

}

最佳答案

有充分的理由使原始包装器最终化。

首先,请注意这些类在语言本身中得到特殊处理 - 与任何普通类不同,这些类被编译器识别以实现自动(取消)装箱。简单地允许子类已经会产生陷阱(展开子类、执行算术和回绕会改变类型)。

此外,包装器类型可以具有共享实例(例如,查看 Integer.valueOf(int)),要求包装器的实例是严格不可变的。允许子类会打开一堆蠕虫,其中不再保证不变性,迫使编写健壮的代码,就好像包装器是可变的一样,导致防御性副本,浪费内存和 CPU 时间,并且还会产生它们在多线程中的实用性问题。线程场景。

要点:包装器类型需要是不可变的,以确保所有实例具有统一的功能;不变性是其已知属性的重要组成部分。为了保证不变性,类型需要是最终的。

如果您需要添加功能,请将其实现为实用程序类,就像您对原语所做的那样(例如,请参见 java.lang.Math)。


编辑:为了解决“类不需要”的情况,必须最终确保不变性。严格来说这是真的,包装器可以设计为非最终类,只使所有方法成为最终类。这将减少大部分陷阱,但会导致另一个问题:与新 Java 版本的兼容性。想象一下,您决定创建自己的子类型 MyInteger 并使用一种新方法,例如“整数减量()”。一切正常,直到......在 Java 20 中,语言设计者决定向 API 添加一个 decrement() 方法(如上所述,这将是final)。 Bam,您的类不再加载,因为它试图覆盖 final 方法。

关于java - 为什么 Java 中的包装器类是最终的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28237542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com