[英]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.