簡體   English   中英

重載構造函數

[英]Overload Constructor

我有一個包含 3 個字段的 MyClass。 但我需要將數據類型info更改為Info的 object ,以容納另外 2 個字段。 字符串信息將等同於info.text 但是在 MyClass 構造函數上有很多 if 調用,我們不想更改它,因為唯一需要的字段是info.text. . 我怎樣才能重載構造函數? 對於某些人來說,將使用參數 object Info而不是 String 來調用新的構造函數。

public class MyClass {
        
       private String status;
       private String reason;
       private String info;

        public MyClass(final String status, final String reason, final String info) {                                  
                this.status= status;
                this.reason= reason;
                this.info= StringUtils.trimToNull(info);
        }

}

@Getter
@Setter
public class Info {

   private String text;
   private String image;
   private String details;

}

如果我沒看錯,你可能想要這樣的東西:

public class MyClass {       
   private String status;
   private String reason;
   private Info info;

    public MyClass(final String status, final String reason, final Info info) {                                  
            this.status= status;
            this.reason= reason;
            this.info = info;
    }

    public MyClass(final String status, final String reason, final String infoText) {                                  
            this(status, reason, new Info().setText(StringUtils.trimToNull(infoText));
    }

含義:您將 class 更改為具有信息 object,而不是“信息”字符串。 然后您允許通過傳遞信息 object 創建您的 class; 但是您保留了現有的構造函數,但調用了新的構造函數,並傳入了一個使用text屬性設置的信息 object。

當然,只有當您的設置器返回他們設置的 object 時才有效。 如果您的 setter 具有返回類型void ,那么調用另一個構造函數的“技巧”是不可能的,在這種情況下,您最終會得到兩個非常相似但構造函數略有不同的主體。

擴展 GhostCat 的答案。 按照我的理解,您需要保留舊的構造函數、getter 和 setter 以支持 Legacy。 您可以替換String info字段,但仍然需要它的 setter 和 getter。 您可以重載setInfo()方法並為新字段添加新的 getter。 此外, Info class 需要重寫Info class 中的toString()方法,以返回一個與遺留代碼所期望的格式相同的String

public class MyClass {       
   private String status;
   private String reason;
   private Info info;

   // constructors

   public void setInfo(String info) {
      // convert String to Info and set in field
   }

   public String getInfo () {
      return info.toString(); // need to override toString() in Info class
   }

   // new getter and setter
   // Overloaded method (different param list)
   public void setInfo (Info info) {
      this.info = info;
   }

   // cannot use same name because param list is the same
   public Info getInfo2() {
      return info;
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM