【问题标题】:Overriding toString method重写 toString 方法
【发布时间】:2012-07-25 22:17:48
【问题描述】:

我正在使用 .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. 尝试获取对象的文本时如何调用此例程?

【问题讨论】:

  • 这是一个好方法,但是在Move.toString() 中创建一个新的Move 实例是一个非常糟糕的主意。

标签: java tostring


【解决方案1】:

覆盖Object.toString 是一个好方法。

然而,您当前的实现犯了一个重大错误,创建了一个新的Move 对象(见下文)。

要调用例程(一旦你修复它),完全按照你已经在做的事情:

jcb.engineMove(move.toString());

如果toString() 应该只用于调试(如mre 所说),您可以实现另一个名为getText 的方法来做同样的事情。

重要提示:

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

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

您的toString 方法应该简单地构建一个字符串并返回它。

【讨论】:

  • 感谢大家的帮助并为我指明了正确的方向。我现在意识到我在 toString 方法中创建了一个新的 Move 对象,这不是最好的方法。我将在 Move 类中编写一个 toString 方法,该方法将返回移动对象的字符串。在过去的 15 分钟里,我学到了很多 - 很棒的网站和很大的帮助。
【解决方案2】:

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());) 并不是一个坏方法。

【讨论】:

  • return rank+file+newRank+newFile; 会简单得多。编译器会自动转换为使用 StringBuilder。
  • 只要其中一个值是字符串就可以工作,但是如果您查看问题,您会发现它们都是整数,因此您的代码甚至无法编译。关于StringBuilder的使用:我只是想给OP一些好的实践,这将有助于他避免一些错误并提高代码效率。
【解决方案3】:

Object#toString 的使用应仅限于调试。

【讨论】:

  • 是的,我在旅行中研究如何返回对象的文本时读到了这一点。我是 Java 新手,边走边学。谢谢
  • 绝对不应该在Move.toString内创建一个新的Move对象!
【解决方案4】:

我希望这不是Move 类中toString() 方法的代码。我担心的原因是您正在其中创建Move 对象并通过s+="" + move; 递归调用toString() 方法(这与s+=move.toString() 相同)。

【讨论】:

    【解决方案5】:
    1. 覆盖 toString() 方法是实现对象的自定义文本表示的常见且正确的方法。您会在整个文献和文档中找到此过程。

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

      李>

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

    【讨论】:

      【解决方案6】:
      1. 在这种情况下,我可能不会使用 toString(),因为您似乎只是在重复 Move 类中的逻辑。为了添加任何其他细节,我有一个问题:您将此 toString() 方法添加到哪个类?

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

        someObj.toString();

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          猜你喜欢
          • 2013-07-12
          • 1970-01-01
          • 1970-01-01
          • 2017-01-25
          • 2010-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多