0

文字列を取り、日付オブジェクトを構築するコンストラクターを作成しようとしています。これはこれまでの私の解決策ですが、次のエラーが発生しています。

コンストラクター呼び出しは、コンストラクターの最初のステートメントでなければなりません

private int m;
private int d;
private int y;
private String[] dateStrings;

public Date(int month, int day, int year) {
          m = month;
          d = day;
          y = year;  
  }

public Date(String s) {
      dateStrings = s.split("/");
      this(Integer.parseInt(dateStrings[0]), Integer.parseInt(dateStrings[1]), Integer.parseInt(dateStrings[2]));
  }

すべての前に必要なthis(...)ことはわかっていますが、最初にdateStringsを入力する必要がある場合、どうすればよいですか? このエラーを回避するにはどうすればよいですか? 注:文字列で日付を作成するには、「月/日/年」の形式です

4

2 に答える 2

2

this()最初に呼び出す必要があります。

代わりに、割り当てをプライベート メソッドに移動します。

private void assginValues (int month, int day, int year){
          m = month;
          d = day;
          y = year;  
}

設定も必要な場合はdateStrings、この方法で構築することもできます。

次に、両方のコンストラクターからメソッドを呼び出します。this()共有メソッドが値の割り当てを処理するため、文字列を受け入れるコンストラクターが呼び出されないようにしてください。

すべてを 1 行で行うこともできますが、split()複数回呼び出すのは無駄です。

this(Integer.parseInt(s.split("/")[0]), Integer.parseInt(s.split("/")[1]), Integer.parseInt(s.split("/")[2]));
于 2013-02-14T03:58:20.503 に答える
1

それを回避するために私が見つけた最善の方法は、静的ファクトリを使用することです

public static Date MakeDate(String s) {
  dateStrings = s.split("/");
  return new Date(Integer.parseInt(dateStrings[0]), Integer.parseInt(dateStrings[1]),  
     Integer.parseInt(dateStrings[2]));
 }

そして、一貫性のために、これをオーバーロードして、1 つのファクトリと 1 つのコンストラクタを持つという奇妙さを完全に回避することができます。

 private Date(int month, int day, int year) {
      m = month;
      d = day;
      y = year;  
  }

 public static MakeDate(int mont, int day, int year){
      //You can figure this part out
 }

これの素晴らしいボーナスは、これらのファクトリに別の名前を付けて、その意図を明確にすることができることです。この場合はおそらく必要ありませんが、特により複雑なクラスでは、あると便利なオプションです。

于 2013-02-14T03:59:45.863 に答える