簡體   English   中英

在super()構造函數中獲取子類名稱

[英]Getting child class name in super() constructor

我有兩個Java類TeradataTableRdbmsTable

RdbmsTable.java有用部分

public class RdbmsTable {

    public RdbmsTable(String uri, String type) {
       this.uri = uri;
       this.type = type;
    } 

TeradataTable.java有用部分

public class TeradataTable extends RdbmsTable {

    public TeradataTable(String uri) {
        super(uri, "TERADATATABLE");
    }

我需要在super()構造函數中以大寫形式設置className。 我不想使用硬編碼的字符串。

我不能使用this.getClass().getSimpleName().toUpperCase(); super()

是否有一些明智的設計?

如果需要在RdbmsTable構造函數中使用該名稱,請在此使用RdbmsTable this.getClass().getSimpleName().toUpperCase() (而不是super ):

public RdbmsTable(String uri) {
   this.uri = uri;
   this.type = this.getClass().getSimpleName().toUpperCase();
}

getClass始終為您提供實例的實際類 ,無論您從何處調用它。 因此,在上面的RdbmsTableRdbmsTable this.getClass()將為該實例實際是什么類返回Class實例。 如果它是TeradataTable實例,則this.getClass()將返回對TeradataTable (不是RdbmsTable )的Class的引用。

現場示例

class Example
{
    public static void main (String[] args) throws java.lang.Exception
    {
        new TeradataTable("foo");
    }
}

class RdbmsTable {
    public RdbmsTable(String uri) {
       System.out.println(this.getClass().getSimpleName().toUpperCase());
    } 

}

class TeradataTable extends RdbmsTable {
    public TeradataTable(String uri) {
        super(uri);
    }
}

輸出:

TERADATATABLE

但是我認為最好使用注釋或類似方法對此進行參數化,以防萬一您需要使用與類名不完全匹配的名稱。

那對你有用嗎?


public class TeradataTable extends RdbmsTable {

    public TeradataTable(String uri) {
        super(uri, TeradataTable.class.getSimpleName().toUpperCase());
    }
  • 它不需要“這個”
  • 這只是您方法的靜態版本
  • 如果您重構類名,它仍然會更新
  • 您可以按原樣保留其他代碼

暫無
暫無

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

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