final在java中的使用

final在java中的使用,java,final,Java,Final,我想知道他们之间有什么区别 public final type attribute_name; 及 基本上,我想将属性设置为只读,这样在初始化后它就不能更改了。 我是将其设置为“公共最终版”,还是将其设置为“私有版”,并且仅通过get方法(没有设置方法)使其可访问?在构造函数退出之前,必须设置一个最终版字段。设置后,无法修改引用(无法重新分配值)。不能重新分配对的强调。这意味着,虽然引用不能更改,值本身可以更改 这是合法的: final List<Integer> list = n

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

public final type attribute_name;

基本上,我想将属性设置为只读,这样在初始化后它就不能更改了。

我是将其设置为“公共最终版”,还是将其设置为“私有版”,并且仅通过get方法(没有设置方法)使其可访问?

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

这是合法的:

final List<Integer> list = new List<Integer>();
list.add(5); // the value of list changes, but the reference doesn't
我们不期望用户的注册时间会改变,所以在构建之后不允许它改变是有意义的


使用不带setter的
private
进行如下操作:

public class User {

    private final long registrationTimeMillis;

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

    public long getRegistrationTimeMillis() {
        return registrationTimeMillis;
    }
}
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;
    }
}
我们不希望
dispensed
的值发生更改,除非调用
dispenseDrink()
stockDrinks(int numberOfDrinks)
。当自动售货机重新加满时,它仍然需要能够被它自己的类重新分配,所以我们不应该让它成为
final

public class UnitConversions {

    public static final double CENTIMETERS_PER_INCH = 2.54;

}

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

祝你好运和快乐的编码


当它不是
final
而是
private
时,类本身可以更改值。

final修饰符只允许一个字段被指定一次-之后不能更改,并且必须在对象构造期间(即在构造函数返回之前)将其设置为

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


您应该仅对真常量使用
public final
。即使您的字段由于
final
而不可更改,通常最好还是将其设置为
private

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


final
关键字:

的完整文档取决于您希望从何处访问它。公共变量可以从项目和包中的任何类访问,而私有变量只能从变量所在的类访问


“final”运算符使其永久且只读。

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

  • public final type attribute\u name
    意味着不能将
    attribute\u name
    重新分配以引用其他内容。但是
    attribute\u name
    可以用来调用更改其状态的方法

  • private-type-attribute\u-name
    中,只有类中的方法才能调用
    attribute\u-name
    上的方法


  • 所以,如果您希望它保持不变,请使用方法(2)。将
    public
    方法限制为那些最终调用
    attribute\u name
    上不修改其状态的方法。

    这取决于一些因素

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


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

    问题在于字段,而不是方法。这并不能回答OP的问题。问题更重要的是,使用get方法将其设置为公共最终或私有之间有什么区别。
    String
    可能是一个误导性的例子,因为它是不可变的。重点是引用不能重新分配,但足够公平。我改变了那个例子,使用了一个
    long
    在我之前刚刚到达那里;)重要的是OP不必在
    private
    和getter之间进行选择,而是两者都要使用。
    public double convertFromCentimetersToInches(double centimeters) {
        return centimeters / UnitConversions.CENTIMETERS_PER_INCH;
    }