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();
}