[英]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;
}
我的问题很基本:
覆盖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()
)。
覆盖toString()方法是实现对象的自定义文本表示形式的常见且正确的方法。 您会在所有文献和文档中找到此过程。
在Java中(就像其他语言(如C#)一样, toString()
方法是在对象类型中定义的,这意味着Java中的每个对象都具有此方法。 如果您的自定义对象(继承自class object
)覆盖了toString()
方法,则您的基类将提供此方法的新实现,该实现会将父类的toString()
方法隐藏/忽略。
这意味着当您在自定义类A中定义自定义toString()
方法时,对该类型的实例(例如a)的调用将导致a.toString()
调用您的实现。
在这种情况下,我可能不会使用toString(),因为看起来您只是在重复Move类中的逻辑。 为了添加任何其他详细信息,我有一个问题:您将此toString()方法添加到哪个类?
您可以像调用其他任何方法一样调用此方法。 首先,您需要一个对象的实例来调用它:
someObj.toString();
要提供更多详细信息,我需要回答上一个问题。
正如mre所说,您不应将toString()用于代码所依赖的功能。 现在,您要完成什么? 您能提供这些类中的任何代码吗? 我认为您的engineMove方法应该使用Move对象,而不是String。 如果您可以提供更多详细信息,我们也许可以为您提供更好的指导。
另外,请谨慎使用已有的代码。 为什么需要在toString()内创建一个占用时间和资源的新Move对象? toString()应该在该类的实例上进行操作,因此您不必使用s + =“” + move创建一个新的实例,甚至更多。 会在新的Move对象上隐式调用toString(),后者会在新的Move对象上再次调用它...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.