簡體   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