Java 在super()构造函数中获取子类名
我有两个Java类Java 在super()构造函数中获取子类名,java,oop,Java,Oop,我有两个Java类teradatable和RdbmsTable- RdbmsTable.java的有用部分 public class RdbmsTable { public RdbmsTable(String uri, String type) { this.uri = uri; this.type = type; } public class TeradataTable extends RdbmsTable { public Tera
teradatable
和RdbmsTable
-
RdbmsTable.java的有用部分
public class RdbmsTable {
public RdbmsTable(String uri, String type) {
this.uri = uri;
this.type = type;
}
public class TeradataTable extends RdbmsTable {
public TeradataTable(String uri) {
super(uri, "TERADATATABLE");
}
teradatable.java的有用部分
public class RdbmsTable {
public RdbmsTable(String uri, String type) {
this.uri = uri;
this.type = type;
}
public class TeradataTable extends RdbmsTable {
public TeradataTable(String uri) {
super(uri, "TERADATATABLE");
}
我需要在super()。我不想使用硬编码字符串
我不能使用this.getClass().getSimpleName().toUpperCase()代码>在super()
中
是否有设计方面的问题?如果您需要在RdbmsTable
构造函数中使用该名称,请在那里使用this.getClass().getSimpleName().toUpperCase()
(而不是super
):
getClass
始终为您提供实例的实际类,无论从何处调用它。因此,在上面的RdbmsTable
中,this.getClass()
将为实例实际是什么类返回Class
实例。如果它是teradatable
实例,this.getClass()
将返回teradatable
的类的引用(而不是RdbmsTable
)
:
输出:
TERADATATABLE
Teradata表
但我认为最好使用注释或类似的方法来参数化它,以防您需要使用与类名不完全匹配的名称。如果您需要在RdbmsTable
构造函数中使用该名称,请在那里使用this.getClass().getSimpleName().toUpperCase()(而不是super
):
getClass
始终为您提供实例的实际类,而不管您从何处调用它。因此,在上面的RdbmsTable
中,this.getClass()
将返回实例实际为的任何类的class
实例。如果它是teradatable
实例,this.getClass()
将返回对teradatable
(非RdbmsTable
)的类的引用
:
输出:
TERADATATABLE
Teradata表
但我认为最好使用注释或类似的方法来参数化它,以防您需要使用与类名不完全匹配的名称。这对您有用吗
public class TeradataTable extends RdbmsTable {
public TeradataTable(String uri) {
super(uri, TeradataTable.class.getSimpleName().toUpperCase());
}
- 它不需要“这个”
- 它只是您方法的静态版本
- 如果重构类名,它仍然会更新
- 您可以保持其他代码不变
这对你有用吗
public class TeradataTable extends RdbmsTable {
public TeradataTable(String uri) {
super(uri, TeradataTable.class.getSimpleName().toUpperCase());
}
- 它不需要“这个”
- 它只是您方法的静态版本
- 如果重构类名,它仍然会更新
- 您可以保持其他代码不变
“我不能在super()
中使用这个.getClass().getSimpleName().toUpperCase();
为什么不呢?这就是你所要求的。但是你不需要在super()中使用它。”
;您可以在基类中执行。@T.J.Crowder我需要输入子类的名称。还有其他类也类似于OracleTable、NetezzaTableYes。和?这就是this.getClass().getSimpleName()
将提供给您的。需要注意的关键问题(可能会混淆OP)是,如果调用this.getClass()
在基类中,它将在运行时返回类名。这将是子类而不是基类。也许OP认为它将返回基类。@AR.3你是对的。我明白你的意思。“我不能在super()
中使用This.getClass().getSimpleName().toUpperCase();
”为什么不呢?这就是你所要求的。但是你不需要在super()
中这样做;你可以在基类中这样做。@t.J.Crowder我需要输入子类的名称。还有其他类也像OracleTable,NetezzaTableYes。还有?这就是this.getClass().getSimpleName()
将给你的。需要注意的关键点(这可能会让OP感到困惑)如果调用this.getClass()
在基类中,它将在运行时返回类名。这将是子类而不是基类。也许OP认为它将返回基类。@AR.3你是对的。我明白了你的意思。谢谢你的澄清。谢谢你的澄清。