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来做同样的事情。

重要的提示:

不应该在其方法 内创建新Move对象。toString

这是一个非常糟糕的主意(正如其他人所提到的)。

您的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
  1. 覆盖 toString() 方法是实现对象的自定义文本表示的常见且正确的方法。您将在整个文献和文档中找到此过程。

  2. 在 Java 中(就像在 C# 等其他语言中的情况一样),toString()方法是在对象类型中定义的,这意味着 Java 中的每个对象都有这个方法。如果您的自定义对象(从 class 继承object)覆盖了该toString()方法,那么您的基类提供了该方法的新实现,该实现隐藏/省略了toString()超类中的方法。

这意味着当您toString()在自定义类 A 中定义自定义方法时,调用该类型的实例(比如说它是 a)a.toString()将导致调用您的实现。

于 2012-07-25T22:25:44.827 回答
1
  1. 在这种情况下,我可能不会使用 toString() ,因为您似乎只是在重复 Move 类中的逻辑。为了添加任何其他细节,我有一个问题:您将此 toString() 方法添加到哪个类?

  2. 您可以像调用任何其他方法一样调用此方法。首先,您需要一个对象实例来调用它:

    someObj.toString();

要提供更多详细信息,我需要回答上一个问题。

于 2012-07-25T22:27:14.127 回答
1

正如 mre 所说,您不应该将 toString() 用于您的代码所依赖的功能。现在,你想完成什么?你能给出这些类的任何代码吗?我认为您的 engineMove 方法应该采用 Move 对象,而不是 String。如果您可以提供更多详细信息,我们也许可以引导您朝着更好的方向前进。

另外,请注意您拥有的代码。为什么需要在 toString() 内部新建一个占用时间和资源的 Move 对象?toString() 应该对类的一个实例进行操作,因此您不需要创建一个新实例,但更重要的是,使用 s+="" + move; 将在新的 Move 对象上隐式调用 toString() ,这将在新的 Move 对象上再次调用它...

于 2012-07-25T22:29:50.767 回答