Java 如果没有 set 方法,为什么我们需要一个声明为 final 的实例变量

Java why do we need an instance variable declared as final if there are no set methods

在我完成 java 课程的过程中,我遇到了这个练习,我在其中创建了一个 commissionemployee class。

public class CommissionEmployee extends Object{  //This is not required, because every class extends Object by default, and the toString method in Object is returned when printing an object.
private final String firstname;
private final String lastname;
private final String socialSecurityNumber;
private double grossSales;
private double commissionRate;

public CommissionEmployee(String firstname, String lastname, String socialSecurityNumber, double grossSales, double commissionRate){ //constructor starts here

并且这个class里面定义的所有方法只有getFirstname(),getLastname等,没有set方法来改变已经初始化的对象,只有传递所有变量才能创建对象参数,因为没有默认构造函数。

在这种情况下,为什么实例变量被声明为private final String?为什么 private String 不被我的课程讲师偏爱?为什么 grossSalescommissionRate 没有声明为 final

声明为 private final String 且未初始化的成员意味着 1) 该成员 必须 在构造时设置,并且 2) 它不能随后设置为引用另一个细绳。这两件事有助于提高程序稳定性。此外,因为任何特定的字符串都是不可变的,所以这些字段是常量。

至于 double 字段,也许可以更改?

将第一个、最后一个和 SSN 设为 final 使这些字段不可变。想一想……那些字段什么时候需要改变?可能永远不会......除非你正在编写一个支持合法名称更改等的应用程序。这就是为什么它们是 final。使它们无法更改。至于grossSalescommissionRate,可以在CommissionEmployee

里面改

JIT(即时)编译器可以更好地优化最终变量和方法。将变量或方法标记为 final 告诉 JIT 编译器它不必担心需要发现被覆盖的方法或重新读取变量指向的值。

final 关键字的大部分目的是表明意图。 firstname、lastname 和 socialSecurityNumber 之类的东西意味着在你的程序过程中不会改变,而 grossSales 可能会改变。

final 有助于防止以后意外更改它,这在具有多个开发人员的大型项目中特别有用,例如,您可能依赖 ssn 不变并使用它来构建缓存以加快查找速度,如果以后它不是最终的另一个开发人员可能会出于其他目的更改 ssn,现在您的缓存会中断。 通过添加 final 它表明您的意图是这是不应该改变的事情。

名字、姓氏和社会安全号码字段定义为最终 这样它们只能在构造函数中设置一次。

grossName 和 commissionRate 更有可能经常更新,因此它们不是最终的。

final 字段只能分配一次,这也是您的老师将它们定义为 final 的唯一原因。假设您的老师使用 final 字段进行编译器优化是错误的,就像其他错误的假设一样。

似乎是代码复杂时的一种自我保护,强调final字段的赋值只能做一次