建立常数的不同方法

时间:2013-11-19 13:56:20

标签: java

在java中,是否有一种可接受的首选方法来进行如下的

public class SomeSubclass extends SomeSuperclass {

    private static int x = 3;

    public SomeSubclass() {
        super(x);
    }
}

同样,如果我有许多从一个超类延伸的子类,并且它们之间存在一些常数,那么实现它的最佳方法是什么?在这里,您可以想象每个子类只是改变x的值和任何其他常量。

拥有大量实例变量并通过保持构造函数统一是一种好习惯吗?此外,当我意识到我的变量实际上并不是常数。将它们设置为公共静态最终会更好吗?

另外,关于构造函数:

public class Someclass extends Aclass {
    public Someclass() {
        super(3);
        setY(9);
    }
}

假设扩展超类的每个子类都对构造函数进行一次参数调用,并调用setY,这是超类中的setter方法。在构造函数中使用setter方法调用或在超类中使用构造函数是否更好,它将自动执行setY的功能

1 个答案:

答案 0 :(得分:1)

这是我们进行面向对象编程的主要原因之一 - 对象是多态的。如果许多对象在某些属性或行为上有所不同,请将其设置为虚拟getter / setter或方法:

class SomeSubclass extends SomeSuperclass {
    @Override
    int getX() { return 3; }

    public SomeSubclass() {
        super();
    }
}

abstract class SomeSuperclass {
    abstract int getX();
    SomeSuperclass() {
        System.out.println( this.getX() );        
    }
}

这里可行,因为在Java中,所有方法调用(甚至来自构造函数,sic!)都是虚拟的。

通常避免从构造函数中调用可覆盖的方法(如果我们调用假定已经构造了整个对象的东西,这会导致内存和引用违规)。

在您的情况下,请考虑:继承真的是您需要的最佳机制吗?也许封装,状态或类似的东西会更好,更自然的解决方案。

我的意思是,如果你真的需要超类'构造函数中的子类的某些属性,请考虑使SomeSuperclass成为SomeSubclass成员而不是继承它。

如果它更重要的话:请考虑制作第三个对象 - 一个状态 - 包含所有成员和getter,它们将存储在类的每个实例中。

在简单的场景中,只需创建static final int并传递给超级构造函数作为参数。