有充分的理由使原始包装最终.
首先,请注意这些类在语言本身中得到特殊处理 – 与任何普通类不同,这些类被编译器识别为实现自动(非)装箱.简单地允许子类就已经造成了陷阱(展开子类,执行算术和回退会改变类型).
此外,包装器类型可以具有共享实例(例如,查看Integer.valueOf(int)),要求包装器的实例严格不可变.允许子类会打开一堆无法再保证不变性的蠕虫,迫使强大的代码被编写,好像包装器是可变的,导致防御性拷贝,浪费内存和CPU时间,并且还会产生问题,因为它们在多个方面有用.线程场景.
本质:包装类型需要是不可变的,以确保所有实例的统一功能;不可变性是他们已知财产的重要组成部分.为了保证不变性,类型需要是最终的.
如果您需要添加功能,请将其实现为实用程序类,就像对基元一样(例如,参见java.lang.Math).
编辑:为了解决“不需要类”的情况,必须最终确保不变性.严格来说,这是真的,包装器可以设计为非最终类,只是使所有方法都是最终的.这将缓解大部分陷阱,但它导致另一个问题:与新Java版本的兼容性.想象一下,您决定使用新方法创建自己的子类型MyInteger,例如: “整数减量()”.一切正常,直到……在Java 20中,语言设计者决定向API添加一个减量()方法(如上所述,这将是最终的). Bam,你的类不再加载,因为它试图覆盖最终方法.