1

オブジェクトの文字列表現を返すために .toString を使用しています。

jcb.engineMove(move.toString());

e2e4 が生成されます。

私がやろうとしているのは、このオブジェクト (e2e4) のテキストを文字列として抽出することです。グーグルの後、 toString メソッドをオーバーライドすることに出くわしたので、これを思いつきました:

@Override
public String toString() {
    String s = "";
    int newRank = getRank();
    int newFile = getFile();
    final Move move = new Move(rank, file, newRank, newFile);
    s+="" + move;
    return s;
}

私の質問はかなり基本的です:

  1. これは正しいアプローチですか
  2. オブジェクトのテキストを取得しようとするときに、このルーチンを呼び出すにはどうすればよいですか?
4

7 に答える 7

8

オーバーライドObject.toStringは良いアプローチです。

ただし、現在の実装では、新しいオブジェクトを作成するという大きな間違いがありMoveます (以下を参照)。

ルーチンを呼び出すには (修正したら)、既に行っていることを正確に実行します。

jcb.engineMove(move.toString());

toString()(mreが言うように)デバッグにのみ使用する必要がある場合getTextは、同じことを行う名前の別のメソッドを実装できます。

重要な注意点:

メソッド 内で新しいオブジェクトを作成しないでくださいMovetoString

これは非常に悪い考えです(他の人が述べたように)。

メソッドtoStringは単純に文字列を作成して返す必要があります。

于 2012-07-25T22:26:36.897 に答える
3

それはクラスにtoString()実装されていますか?Moveはいの場合、私が見るのは無限ループです。Moveそして...クラスの新しいインスタンスを作成している理由がよくわかりません。

とにかく、Moveクラスで文字列表現を生成するには、次のようなものを試してください。

public class Move {

  @Override
  public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append(rank).append(file);
    builder.append(newRank).append(newFile);
    return builder.toString();
  }

}

次に、文字列表現を取得したい場合、実際に行っていること(jcb.engineMove(move.toString());)は悪いアプローチではありません。

于 2012-07-25T22:29:21.533 に答える
2

の使用はObject#toStringデバッグに限定する必要があります。

于 2012-07-25T22:18:54.863 に答える
2

これがクラスのtoString()メソッドのコードでないことを願っています。Move私の恐れの理由は、その中にオブジェクトを作成し、再帰的にメソッドMoveを呼び出すことです(これは と同じです)。toString()s+="" + move;s+=move.toString()

于 2012-07-25T22:35:20.173 に答える
1

mreが言ったように、コードが機能するために依存するものにはtoString()を使用しないでください。さて、あなたは何を達成しようとしていますか?これらのクラスからコードを提供できますか?engineMoveメソッドは、StringではなくMoveオブジェクトを受け取る必要があると思います。あなたがもう少し詳細を与えることができれば、私たちはあなたをより良い方向に導くことができるかもしれません。

また、あなたが持っているそのコードに注意してください。toString()内で時間とリソースを消費する新しいMoveオブジェクトを作成する必要があるのはなぜですか?toString()はクラスのインスタンスで動作する必要があるため、新しいインスタンスを作成する必要はありませんが、s + = ""+move;を使用してさらに作成する必要があります。新しいMoveオブジェクトで暗黙的にtoString()を呼び出し、新しいMoveオブジェクトで再度呼び出します。

于 2012-07-25T22:29:50.767 に答える
1
  1. toString() メソッドを上書きすることは、オブジェクトのカスタム テキスト表現を実装する一般的で正しい方法です。この手順は、文献やドキュメント全体に見られます。

  2. Java では (C# などの他の言語の場合と同様に)、toString()メソッドはオブジェクト型で定義されます。つまり、Java のすべてのオブジェクトにはこのメソッドがあります。カスタム オブジェクト ( class から継承object) がメソッドを上書きする場合、基本クラスはこのメソッドの新しい実装を提供し、スーパー クラスからtoString()メソッドを非表示/省略します。toString()

つまりtoString()、カスタム クラス A でカスタム メソッドを定義すると、その型のインスタンス (a など)a.toString()を呼び出すと、実装が呼び出されます。

于 2012-07-25T22:25:44.827 に答える
1
  1. Move クラスにあるロジックを単純に繰り返しているように見えるため、この場合はおそらく toString() を使用しません。他の詳細を追加するために、1 つ質問があります。この toString() メソッドをどのクラスに追加しますか?

  2. このメソッドは、他のメソッドと同じように呼び出します。まず、それを呼び出すオブジェクトのインスタンスが必要です。

    someObj.toString();

詳細を説明するには、前の質問への回答が必要です。

于 2012-07-25T22:27:14.127 に答える