Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在构造函数中设置并可以';不能改变_Java_Constructor_Final_Protected - Fatal编程技术网

Java 在构造函数中设置并可以';不能改变

Java 在构造函数中设置并可以';不能改变,java,constructor,final,protected,Java,Constructor,Final,Protected,嘿,伙计们,我在做一个“特许经营”项目。特许经营有所有者(特许经营名称的所有者)、州(特许经营所在州的2个字符字符串)和销售额(特许经营一天的总销售额),这些都是在构造函数中设置的,不能更改 package prob2; public class Franchise { final String name; final String state; final double sales; protected Franchise(String name, String s

嘿,伙计们,我在做一个“特许经营”项目。特许经营有所有者(特许经营名称的所有者)、州(特许经营所在州的2个字符字符串)和销售额(特许经营一天的总销售额),这些都是在构造函数中设置的,不能更改

package prob2;

public class Franchise {
    final String name;
    final String state;
    final double sales;

protected Franchise(String name, String state, double sales ) {
    this.name = name;
    this.state = state;
    this.sales = sales;
  }
我的问题是:名称、状态和销售额必须在构造函数中设置,并且不能更改。我使用“protected”是否正确,还是将变量设置为“final”更好


感谢您的帮助。

目前没有任何东西可以修改它们,但是没有任何东西可以阻止您添加一个可以修改它们的方法。你当前的路径意味着你必须记住它们是不应该改变的

如果您的目的是让它们永不改变,则将它们设置为最终。这意味着编译器将检查您是否试图修改它们,并确保您在构造函数中为它们指定了一个值。它还将向其他开发人员(包括一周后的您)表明,他们永远不会改变

我使用“protected”是否正确,还是将变量设置为“final”更好

protected
关键字的含义与您认为的不同。实际上(在本例中)的意思是:

“同一包中的任何类以及该类的任何子类都可以调用此构造函数”

它不会直接“保护”字段

正确的解决方案是将
final
修饰符添加到不希望更改的字段中。然后,Java编译器将停止您编写(普通)Java代码来修改相应的字段



我们还应该注意,即使是
final
字段也不能免于更改。可以在运行时使用反射覆盖修饰符,甚至更改
私有final
字段。如果您打算使用
private
final
实现硬安全性,则需要考虑这一点。基本上,这只起到保护作用,防止不受信任的代码被沙盒。。。即使这样,它也只保护字段的值,而不保护字段所指的对象。

我更新了代码,将变量设置为final。我的第二个问题是:既然我正在将其设置为final,并且稍后将在main方法中将名称传递给构造函数,那么我还需要getter和setter吗?@user2745043:getter,是的,但是setter在这种情况下没有意义,对吗?如果您想再次获取值,您需要getter。你不能使用setter,因为一旦你给了一个最终变量一个值,它就被设置了,你就不能改变它。我需要实现一个compareto方法,这就是为什么我质疑getter和setter。我不需要getter来获取要比较的值吗?使用compareTo可以直接引用变量,因为它在同一个类中。如果getter只是返回变量,则不需要在内部使用它。请不要在回答问题后更改它。相反,问一个新问题。