1

嘿伙计们,我正在开发一个程序“特许经营”。Franchise 有 owner(特许经营名称的所有者)、state(特许经营所在州的 2 字符字符串)和 sales(特许经营一天的总销售额),它们都设置在构造函数,不能更改。

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

我的问题是:必须在构造函数中设置名称、状态和销售额,并且不能更改我是否使用“受保护”正确执行此操作,还是将变量设置为“最终”更好?

感谢您的任何帮助。

4

2 回答 2

1

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

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

于 2013-09-10T03:05:25.517 回答
1

我是使用“受保护”正确地做这件事,还是将变量设置为“最终”更好?

protected关键字并不意味着您认为它意味着什么。实际上是什么意思(在这种情况下)是:

“这个构造函数可以被同一个包中的任何类以及这个类的任何子类调用”。

它不直接“保护”这些字段。

正确的解决方案是将final修饰符添加到您不想更改的字段中。然后,Java 编译器将阻止您编写修改各个字段的(正常)Java 代码。


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

于 2013-09-10T03:12:12.890 回答