2016-09-22 52 views
0

我有兩個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。我不想使用硬編碼的字符串。我不能在super()中使用this.getClass().getSimpleName().toUpperCase();

是否有東西擰設計明智?

+2

*「我不能在'super()'中使用'this.getClass()。getSimpleName()。toUpperCase();''」*爲什麼不?這就是你如何去做你所要求的。但是你不需要在'super()'中執行。你可以在基類中做到這一點。 –

+0

@ T.J.Crowder我需要把兒童班的名字。還有其他類,如OracleTable,NetezzaTable –

+0

是的。和?這就是'this.getClass()。getSimpleName()'會給你的。 –

回答

3

如果您在RdbmsTable構造需要一個名字,使用this.getClass().getSimpleName().toUpperCase()那裏(而不是super):

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

getClass始終爲您提供了實例的實際的類,無論你來自哪裏,調用它的。因此,在上面的RdbmsTable中,this.getClass()將返回Class實例,用於實例實際上的任何類。如果它是TeradataTable實例,則this.getClass()將返回對TeradataTable(不是RdbmsTableClass的引用。

Live Example

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 

但是我認爲這將是更好地使用註釋或一些這樣的參數化這一點,如果你需要使用一個名稱這並不是確切的在某個時刻與類名相匹配。

+0

感謝您的澄清。 –

0

這對你有用嗎?


public class TeradataTable extends RdbmsTable { 

    public TeradataTable(String uri) { 
     super(uri, TeradataTable.class.getSimpleName().toUpperCase()); 
    } 
  • 它並不需要「這個」
  • 它只是你的方法的靜態版本
  • ,如果你重構你的類名
  • 可以保持其他代碼,因爲它仍然更新是'