繁体   English   中英

在java中使用final

[英]Usage of final in java

我想知道它们之间有什么区别

public final type attribute_name;

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

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

当它不是final而是private ,该类本身就能够改变它的价值。

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

这是合法的:

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的private变量可以由保存它的类在内部重新分配(但它在外部不可见,因此不能在持有它的类之外重新分配)。 此外,在类之外,引用是不可访问的,因此除了持有它的类之外,不能修改变量。

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

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


使用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;
    }
}

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


关于使用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和快乐的编码。

更多关于最终字段的阅读

final修饰符允许只分配一次字段 - 之后不能更改它,并且必须在对象构造期间(即构造函数返回之前)设置它。

如果要将字段设置为只读,请使用信息隐藏原则:将其设置为私有并提供返回字段的公共getter(或非原始类型的字段的副本)。

你应该只使用public final作为真正的常量。 即使你的领域因为final不可变而仍然是一个好主意仍然是private

这取决于一些因素。

如果这是一个以前已知并且永远不会改变的实常数,则使用final 在Java中, final字段也可以在构造函数中初始化,因此如果您的值在构造时已知,那么您也可以使用final

如果在运行时期间设置此值(一次,多次),则使用private + getter

正确的方法是在未来思考。 什么可以帮助您实现目标? 也许以后你也想给这个变量一个值。 如果我是你,我会通过一个get方法创建并保持变量私有。

final关键字的完整文档: http//en.wikipedia.org/wiki/Final_(Java)

取决于您要从哪里访问它。 公共变量可以从项目和包中的任何类访问,其中private只能从变量所在的类访问。

'final'运算符使其成为永久和只读。

我们假设type是对象的引用,而不是基本类型。

  1. public final type attribute_name表示不能重新分配attribute_name以引用其他内容。 但是attribute_name 用于调用更改其状态的方法。

  2. private type attribute_name ,只有类中的方法可以调用attribute_name方法。

因此,如果您希望它保持不变,请使用方法(2)。 public方法限制为最终调用attribute_name上不修改其状态的方法的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM