![]() |
1
5
另一种方法是在构造函数主体之前执行初始化器列表,因此允许初始化最终字段:
在初始值设定项列表中,不允许您阅读
|
![]() |
2
3
您应该在设计API时考虑到您的用户,然后以任何更简单、更易于维护的方式实现它。这个问题是关于后一部分的。 如果可能的话,让fields成为final是很好的选择,如果不可能的话,让fields成为公共getter的私人成员是一个很好的选择。做什么是你的选择,因为维护类的是你,其他人不需要查看公共API。
不过,它很快就会变得丑陋,因此将其作为静态辅助函数通常更好。
工厂构造函数是一种简单的方法,您可以计算所需的一切,然后在最后调用私有生成构造函数。唯一的“问题”是,通过不公开生成构造函数,您会阻止其他人扩展您的类。我引用“问题”是因为这不一定是坏事——允许人们扩展类是一种合同,它限制了你可以用类做什么。 我倾向于使用公共工厂构造函数和私有生成构造函数,即使出于任何实际原因不需要,只是为了禁用类扩展。
需要
总之,没有严格的规定。如果你喜欢final字段,你可以做额外的工作使它们成为final,或者你可以把易变性隐藏在getter后面——这是一个实现和可维护性的选择,而你是维护代码的人。 只要您保持抽象干净,并跟踪您向用户承诺的内容(生成构造函数?const构造函数?)因此,您不会破坏这一点,您可以随时更改实现。 |
![]() |
Alaa AbuZarifa · 将方法参数复制到最终temp变量无效 7 年前 |
![]() |
CameronCoob · 最终var更改值JAVA 7 年前 |
![]() |
gcolucci · 函数调用后最终对象失去属性值 7 年前 |
![]() |
Goji Berry · 错误:无法为最终变量赋值 7 年前 |