繁体   English   中英

重写toString方法

[英]Overriding toString method

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

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

但是 ,当前的实现通过创建一个新的Move对象而犯了一个重大错误(请参见下文)。

要调用例程(一旦您修复了该例程),请完全执行您已经在做的事情:

jcb.engineMove(move.toString());

如果toString()仅用于调试(如mre所述),则可以实现另一个名为getText方法,该方法可以执行相同的操作。

重要的提示:

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

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

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

是在Move类中实现的toString() 如果是,那么我看到的是一个无限循环。 而且...我不太明白为什么要创建一个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()); )并不是一个坏方法。

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

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

  1. 覆盖toString()方法是实现对象的自定义文本表示形式的常见且正确的方法。 您会在所有文献和文档中找到此过程。

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

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

  1. 在这种情况下,我可能不会使用toString(),因为看起来您只是在重复Move类中的逻辑。 为了添加任何其他详细信息,我有一个问题:您将此toString()方法添加到哪个类?

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

    someObj.toString();

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

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

另外,请谨慎使用已有的代码。 为什么需要在toString()内创建一个占用时间和资源的新Move对象? toString()应该在该类的实例上进行操作,因此您不必使用s + =“” + move创建一个新的实例,甚至更多。 会在新的Move对象上隐式调用toString(),后者会在新的Move对象上再次调用它...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM