加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在java中使用final

发布时间:2020-12-15 04:23:40 所属栏目:Java 来源:网络整理
导读:我想知道它们之间有什么区别 public final type attribute_name; 和 private type attribute_name;public type getA_name() { return attribute_name;} 基本上我想将属性设置为只读,因此在初始化后它不能改变. 我是公开最终的,还是将其设为私有,并且只能通过
我想知道它们之间有什么区别

public final type attribute_name;

private type attribute_name;
public type getA_name() {
  return attribute_name;
}

基本上我想将属性设置为只读,因此在初始化后它不能改变.
我是公开最终的,还是将其设为私有,并且只能通过get方法访问它(没有set方法)?

解决方法

必须在构造函数退出之前设置最终字段.设置后,无法修改引用(无法重新分配值).强调不能重新分配.这意味着虽然引用不能更改,但值本身可以更改.

这是合法的:

final List<Integer> list = new List<Integer>();
list.add(5); // the value of list changes,but the reference doesn't

这不是:

final List<Integer> list = new List<Integer>();
list = new List<Integer>(); // may seem sort of redundant but the compiler won't allow it nonetheless

具有唯一getter的私有变量可以由保存它的类在内部重新分配(但它在外部不可见,因此不能在持有它的类之外重新分配).此外,在类之外,引用是不可访问的,因此除了持有它的类之外,不能修改变量.

最终变量不能在任何地方重新分配,但如果它是公共的,则另一个类仍然可以访问引用并更改它指向的任何对象的值.

如果您不希望在初始化之后重新分配变量,请使用final和private.

使用final来做这样的事情:

public class User {

    private final long registrationTimeMillis;

    public User(/* various parameters probably would be here */) {
        registrationTimeMillis = System.currentTimeMillis();
    }

    public long getRegistrationTimeMillis() {
        return registrationTimeMillis;
    }
}

我们不希望用户的注册时间会发生变化,所以在构建之后不允许它更改是有意义的.

对于像这样的事情,使用private而不使用setter:

public class VendingController() {

    private int drinksStocked = 0;
    private int drinksDispensed = 0;

    public void dispenseDrink() {
        drinksDispensed++;
    }

    public void stockDrinks(int numberOfDrinks) {
        drinksStocked = getDrinksRemaining() + numberOfDrinks;
        drinksDispensed = 0;
    }

    public int getDrinksRemaining() {
        return drinksStocked - drinksDispensed;
    }
}

除非调用allocateseDrink()或stockDrinks(int numberOfDrinks),否则我们不希望drinkDispensed的值发生变化.当自动售货机重新装满时,它仍然需要能够由自己的班级重新分配,所以我们不应该让它最终

关于使用public final,通常在Java中只对常量执行,并且还包括static关键字,因为常量不应该依赖于实例.

使用public static final时有意义的一个例子

public class UnitConversions {

    public static final double CENTIMETERS_PER_INCH = 2.54;

}

然后可以将其用于如下方法中

public double convertFromCentimetersToInches(double centimeters) {
    return centimeters / UnitConversions.CENTIMETERS_PER_INCH;
}

祝你好运OP和快乐的编码.

More reading on final fields

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读