【问题标题】:Assigning String to a final String将字符串分配给最终字符串
【发布时间】:2015-09-18 21:47:52
【问题描述】:

我有几个这样的课程:

public class A {
    private String foo;

    public A(String f) {
        foo = f; // I want foo to be final based on the subclass instance
    }
}

public class B extends A {
    private static final String FOO = "foo1";

    public B() {
        super(FOO);
    }
}

public class C extends A {
    private static final String = "foo2";

    public C() {
        super(FOO);
    }
}

我想要的是当我在 B 类型上创建一个对象时,我不希望 A 中的 String 可以更改。 foo = f 只是分配一个引用,但我希望 foo 成为相同的最终对象 FOO。我该怎么做?

【问题讨论】:

  • 您误解了引用和可变性。 String 是不可变的。
  • 我想保证 foo 也是 "foo1" 或 "foo2" 并且没有人可以改变它。
  • 那么就让它final。另外,请考虑使用枚举。
  • 如果您希望字段 foo 成为最终字段,请声明为:private final String foo;

标签: java string object static final


【解决方案1】:

看来你根本不想要一个字段,而是你可以有一个方法。

interface A {
    String foo(); // the implementation depends on the sub-class.
}

class B implements A {
    public String foo() { return "foo1"; }
}

class C implements A {
    public String foo() { return "foo2"; }
}

【讨论】:

    【解决方案2】:

    这可能不是最好的设计,但你想做的是初始化一个最终的字符串。

    public class A {
        private final String foo;
    
        public A(String f) {
            foo = f; 
        }
    }
    

    final变量只能初始化一次,所以可以在构造函数中初始化。但在您的情况下,这是没有意义的,因为您的子类无法访问 foo 因为它是私有的。有关所有可用的 Java 可见性修饰符,请参阅 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      相关资源
      最近更新 更多