簡體   English   中英

如何創建一個新的數據類型,稱為標識符,它的每個實例都應該是一個有效的標識符名稱?

[英]How can I make a new data type called Identifier that every instance of it should be a valid identifier name?

我可以按照標題中的要求進行這門新課嗎,這是我的嘗試。

import javax.lang.model.*;

public class Ide{
    public Ide New(String ide){
        if (SourceVersion.isName(ide)) {
            return ide;
        } 
    }
}

但是它無法編譯,因為我無法將String ide轉換為Ide類型,我該怎么做? 我需要輸入Ide類型,謝謝。

此代碼有幾個問題:

  • Stringfinal 這意味着任何類都不能從String繼承。
  • New應該是static ,否則該方法將毫無意義。 要求一個類的實例創建其他實例就像“雞與蛋”問題一樣,只是您一個都沒有。
  • 調用方法New 確實不好的樣式。 new是Java中的關鍵字,並且會引起編碼錯誤,使代碼的可讀性降低...。 而且方法名稱不應大寫。
  • 即使可以從String擴展類,但String -parameter不會自動成為Ide -instance。 因此, return ide; 不會編譯。

解決您的問題的方法是:
使用private構造函數和static工廠方法。 該類只能是包裝器類。 只需以適配器樣式實現即可提供String提供的所需方法:

class Ide{
    private String str;

    private Ide(String str){
        this.str = str;
    }

    public static Ide createIde(String str)
        throws IllegalArgumentException
    {
        if(validIdentifier(str))
            return new Ide(str);
        else
            throw new IllegalArgumentException("Invalid identifier: " + str);
    }

    //examples for adapter-like method-implementation
    public String toString(){
        return str.toString();
    }

    public char charAt(int i){
        return str.charAt(i);
    }
}

您的代碼在許多層次上都是錯誤的。 我建議您首先了解Java的基礎知識。 在考慮編寫自己的代碼之前。

您的代碼中的問題:

  1. Java String類是final ,這意味着其他任何類都不能從String繼承(因此Ide無法擴展String)
  2. 您將您的方法稱為“新建”。 那是一個方法的超級壞名字。 調用它為例:“ generateIdeFromName()”。
  3. 編譯器會告訴您什么地方不對:字符串對象不是Ide對象。 因此,您不能將String分配給Ide(這就是應該返回Ide對象的方法會返回String的情況)

長話短說:您正在嘗試建造摩天大樓,但您已經缺乏在地面上挖掘整塊土地的技能。 這並不是要侮辱您,而是事實:您必須首先學習很多東西。 不要指望我們向您解釋所有您想出一個合理的程序所需的內容。

暫無
暫無

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

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