Java 超类中未使用的变量
Java 超类中未使用的变量,java,constructor,initializing,Java,Constructor,Initializing,变量在ABC中使用,但在DEF中完全未使用且不必要。但是我看不到任何合适的方法来阻止在DEF中创建这个大数组,因为总是要执行一些超类的构造函数。 我只看到一种不雅观的方式:ABC新的“假”构造函数: class ABC { private int[] variable; public int[] getVariable() { return variable; } public ABC() { variable = new int[
变量
在ABC
中使用,但在DEF
中完全未使用且不必要。但是我看不到任何合适的方法来阻止在DEF
中创建这个大数组,因为总是要执行一些超类的构造函数。
我只看到一种不雅观的方式:ABC新的“假”构造函数:
class ABC {
private int[] variable;
public int[] getVariable() {
return variable;
}
public ABC() {
variable = new int[123456];
}
}
class DEF extends ABC {
public int[] getVariable() {
return new int[0];
}
}
然后在DEF
中,我可以写:
protected ABC(boolean whatever) {}
它可以工作-变量
未初始化
但是,我的问题是——我能更恰当地解决这个问题吗
也许若变量未使用,编译器会自动删除它?通常情况下,这样的功能可能很有用。您确定
DEF
需要扩展ABC
-我的意思是,DEF
逻辑上是ABC
?继承功能强大,但需要谨慎使用
就你而言,我宁愿:
public DEF() {
super(true);
}
并让
ABC
和DEF
使用变量实现。这种方式构造一个ABC
对象将初始化所需的变量,而构造一个DEF
对象将不会做任何事情,但它们都会回复相同的消息(getVariable()
)。一个有趣的问题。由于变量
在ABC中被标记为private,并且getter被重写,因此DEF绝对无法访问它。我还想知道编译器是否能够在优化过程中删除它。@jeroen_de_schutter它可能还必须检测它是否通过反射使用,这可能会更加困难/不可能。是的。。。反射我总是忘记那件事。它让Java编程失去了所有乐趣:-(+1非常好的答案,但如果DEF
是ABC
,问题仍然没有答案。我认为解决OP问题的正确方法是使用接口,因为您没有使用构造函数中填充的变量
原始值是一种气味,DEF
不是真正的ABC
。是的,我想让DEF成为ABC。对不起,我不知道如何插入更多的代码:@KrzysztofStanisławek如果是这样的话,将Log
类抽象化,或者创建一个Log
接口。另外,在您当前的设计中,BetterLog
有两个ArrayList entryList;
,一个来自超类,另一个隐藏超级类中的字段。我同意Luiggi的观点-从您的代码来看,您应该有一个接口BetterLog
不重用Log
的当前功能,您还重新分配了protected
变量。扩展Log.Entry
是可以的,但是BetterLog
和>日志
应实现相同的接口IMHO。
public interface WithVariable {
int[] getVariable();
}