【问题标题】:Set in constructor and can't be changed在构造函数中设置并且不能更改
【发布时间】:2013-09-13 15:25:03
【问题描述】:

大家好,我正在开发“特许经营”计划。 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;
  }

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

感谢所有帮助。

【问题讨论】:

  • 请不要在已回答问题后更改问题。而是提出一个新问题。

标签: java constructor final protected


【解决方案1】:

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

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

【讨论】:

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

我是使用 'protected' 正确地做这件事,还是将变量设置为 'final' 更好?

protected 关键字并不像您认为的那样。实际上是什么意思(在这种情况下)是:

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

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

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多