【问题标题】:How to write a 2 constructors for initialising 2 different private final variables?如何编写 2 个构造函数来初始化 2 个不同的私有最终变量?
【发布时间】:2017-10-28 20:39:29
【问题描述】:
public class InitialisingFields {
    private final String a;
    private final String b;
    private final String c;

    InitialisingFields(String a,String b){
        this.a = a;
        this.b = b;
    }

    InitialisingFields(String a,String b,String c){
        this(a , b);
        this.c = c;
    }
    public static void main(String[] args) {
        InitialisingFields i = new InitialisingFields("A","B","C"); 
    }
}

我想编写 InitialisingFields(String a,String b,String c) 构造函数,但它给了我编译错误。

对于InitialisingFields(String a,String b),它说“空白最终字段 c 可能尚未初始化” & 对于InitialisingFields(String a,String b,String c),它说“空白的最终字段 c 可能已经被初始化”

我不想修改InitialisingFields(String a,String b) 并添加一个参数,因为它已被许多类使用,我将不得不重构大量类。对于我的用例,我想使用对象这个类有额外的参数。

【问题讨论】:

  • 如果不提供c,你希望它是什么?
  • 所有final变量必须在每个构造函数结束时初始化。
  • 我希望只在调用构造函数时初始化 c。所以这样我不会破坏现有的类。

标签: java constructor compiler-errors initialization final


【解决方案1】:

你应该反过来 - 有一个初始化所有字段的构造函数,并让其他(S)用默认值调用它:

InitialisingFields(String a, String b) {
    this(a, b, null);
}

InitialisingFields(String a, String b, String c) {
    this.a = a;
    this.b = b;
    this.c = c;
}

【讨论】:

  • 问题是如果我修改现有的构造函数,那么我必须修复很多已经使用这个构造函数并且数量很大的类。
  • @AmardeepSingh 我建议的修复改变了给定构造函数的实现,而不是它的签名。您将不必修改任何使用它的代码。
  • 太好了,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 2011-03-18
相关资源
最近更新 更多