Java 在构造函数中设置并可以';不能改变
嘿,伙计们,我在做一个“特许经营”项目。特许经营有所有者(特许经营名称的所有者)、州(特许经营所在州的2个字符字符串)和销售额(特许经营一天的总销售额),这些都是在构造函数中设置的,不能更改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
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只是返回变量,则不需要在内部使用它。请不要在回答问题后更改它。相反,问一个新问题。