重写toString方法
我使用.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中的每个对象都有这种方法。 如果您的自定义对象(inheritance自类object
)覆盖了toString()
方法,那么您的基类提供了此方法的新实现,该方法隐藏/省略了超类中的toString()
方法。
这意味着当您在自定义类A中定义自定义toString()
方法时,调用该类型的实例(比如说它是a) a.toString()
将导致调用您的实现。
-
在这种情况下,我可能不会使用toString(),因为它似乎只是重复Move类中的逻辑。 为了添加任何其他细节,我有一个问题:你在哪个类中添加这个toString()方法?
-
您可以像调用任何其他方法一样调用此方法。 首先,您需要一个对象实例来调用它:
someObj.toString();
为了提供更多细节,我需要回答上一个问题。
如上所述,你不应该使用toString()来代替你的代码所依赖的function。 现在,你想要完成什么? 你能提供这些课程的代码吗? 我认为你的engineMove方法应该采用Move对象,而不是String。 如果您能提供更多细节,我们可能会引导您朝着更好的方向前进。
另外,请注意您拥有的代码。 为什么需要创建一个占用toString()内部时间和资源的新Move对象? toString()应该在类的实例上运行,所以你不需要创建一个新的,但更多的是,使用s + =“”+ move; 将隐式调用新Move对象上的toString(),它将在新的Move对象上再次调用它…