【问题标题】:How to use if else statement in java constructor如何在java构造函数中使用if else语句
【发布时间】:2021-11-21 07:17:26
【问题描述】:

我正在尝试在 java 中重载构造函数。它的变量中有两个字符串,如果我在只调用其中一个字符串的情况下编写两个单独的构造函数,这是有问题的。这就是为什么我想使用以下代码:

public Timbre(String string){
    if(string.indexOf("-") == -1){
        this, ANNEE_COURANTE, string, VALEUR_TIMBRE_DEFAUT);
    } else{
        this(string, ANNEE_COURANTE, PAYS_DEFAUT, VALEUR_TIMBRE_DEFAUT);
    }
}

但是,VSC 告诉我“构造函数调用必须是构造函数中的第一条语句”。 我该如何克服这个问题?

【问题讨论】:

  • 代码无法编译,您在语句的第一个分支中缺少左括号和参数。 this, ANNEE_COURANTE, ... 不会被视为构造函数调用。
  • 这似乎是一个你需要不同创作策略的地方;使用Builder 可能是合适的。

标签: java constructor-overloading


【解决方案1】:

为此,您应该使用Factory Design Pattern,在您的情况下甚至可以像这样实现:

class Timbre{
    // various constructors - all private!

    // static factory method 
    public static Timbre of(String string){
        if(string.indexOf("-") == -1){
            return new Timbre(ANNEE_COURANTE, string, VALEUR_TIMBRE_DEFAUT);
        } else{
            return new Timbre(string, ANNEE_COURANTE, PAYS_DEFAUT, VALEUR_TIMBRE_DEFAUT);
        }
    }
}

阅读有关工厂设计模式的更多信息:

【讨论】:

    【解决方案2】:

    您不能使用 if / else 在构造函数链接中的不同 this(...)super(...) 调用之间进行选择。 Java 中根本不允许这样做。 thissuper 调用必须在编译时解析为单个构造函数重载。

    (AFAIK) 你可以在构造函数链中做“有条件的事情”的唯一方法是这样的:

    public MyClass(...)
        this(boolean_expression ? yes_expression : no_expression, ...);
        ...
    }
    

    在这两种情况下,我们都链接到相同的构造函数重载,但在“是”和“否”情况下使用不同的参数值。

    【讨论】:

      【解决方案3】:

      Java 要求对this() 的调用是构造函数中的第一条语句。您可以使用三元表达式来获得与if ... else ... 相同的效果。但是,您需要为两条路径调用相同的构造函数。

      你可以试试这样的:

      public Timbre(String string) {
        this(
          ANNEE_COURANTE,
          (string.indexOf("-") == -1) ? PAYS_DEFAUT : string,
          VALEUR_TIMBRE_DEFAUT
        );
      }
      

      【讨论】:

        【解决方案4】:

        要重载构造函数,您需要多个具有不同签名的构造函数方法。

        根据您的要求,您似乎正在传递一个参数,并希望根据其值来决定执行流程。

        为此,您可以创建两个不同的方法,可以像您正在做的那样根据单个构造方法中的条件相应地调用它们,但将 this 的调用更改为常规方法。

        【讨论】:

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