我使用.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;
}
我的问题非常基础:
答案 0 :(得分:8)
覆盖Object.toString
是一种很好的方法。
然而,您当前的实现通过创建新的Move
对象(见下文)而犯了一个重大错误。
要调用例程(一旦修复它),请完成您正在执行的操作:
jcb.engineMove(move.toString());
如果toString()
只应该用于调试(如mre所说),你可以实现另一个名为getText
的方法,它可以做同样的事情。
重要提示:
您不应在其Move
方法中创建新的toString
对象。
这是一个非常糟糕的主意(正如其他人所说)。
您的toString
方法应该只是构建一个字符串并将其返回。
答案 1 :(得分: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());
)并不是一个糟糕的方法。
答案 2 :(得分:2)
Object#toString
的使用应限于调试。
答案 3 :(得分:2)
我希望这不是toString()
类中Move
方法的代码。我担心的原因是你在其中创建Move
对象并通过toString()
递归调用s+="" + move;
方法(这与s+=move.toString()
相同)。
答案 4 :(得分:1)
覆盖toString()方法是实现对象的自定义文本表示的常用方法。您将在整个文献和文档中找到此程序。
在Java中(与C#等其他语言一样),toString()
方法在对象类型中定义,这意味着Java中的每个对象都有此方法。如果您的自定义对象(继承自类object
)覆盖toString()
方法,则您的基类提供此方法的新实现,该方法隐藏/省略超类中的toString()
方法。
这意味着当您在自定义类A中定义自定义toString()
方法时,调用该类型的实例(比如说是a)a.toString()
会导致调用您的实现。
答案 5 :(得分:1)
在这种情况下,我可能不会使用toString(),因为看起来你只是在重复Move类中的逻辑。为了添加任何其他细节,我有一个问题:你在哪个类中添加这个toString()方法?
您可以像调整其他任何方法一样调用此方法。首先,您需要一个对象实例来调用它:
someObj.toString();
要提供更多详情,我需要回答上一个问题。
答案 6 :(得分:1)
如上所述,你不应该使用toString()来代替你的代码所依赖的功能。现在,你想要完成什么?你能提供这些课程的代码吗?我认为你的engineMove方法应该采用Move对象,而不是String。如果你能提供更多细节,我们可能会引导你朝着更好的方向前进。
另外,请注意您拥有的代码。为什么需要创建一个占用toString()内部时间和资源的新Move对象? toString()应该在类的实例上运行,所以你不需要创建一个新的,但更重要的是,使用 s + =“”+移动; 将隐式调用新Move对象上的toString(),它将在新的Move对象上再次调用它...