在super()构造函数中获取子类名

时间:2016-09-22 07:32:53

标签: java oop

我有两个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()

有什么东西可以让设计明智吗?

2 个答案:

答案 0 :(得分: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()会返回Class TeradataTable的引用(不是RdbmsTable)。

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

但是我认为最好使用注释或其他类似参数化,以防您需要使用不符合完全匹配的名称某个时候的班级名称。

答案 1 :(得分:0)

这会对你有用吗?


public class TeradataTable extends RdbmsTable {

    public TeradataTable(String uri) {
        super(uri, TeradataTable.class.getSimpleName().toUpperCase());
    }
  • 它不需要'这个'
  • 它只是您方法的静态版本
  • 如果您重构您的班级名称,它仍然会更新
  • 您可以按原样保留其他代码