与抽象getters和安装员的抽象类

时间:2013-11-20 22:31:15

标签: java

假设我有一个抽象类List,我想创建一个扩展名为MyList的类的类。在抽象类中放置抽象getter和setter是不是很糟糕的编程习惯,迫使MyList覆盖它们?

我想要这样做的原因就像为List的每个专业化设置不同的容量。所以我会做这样的事情:

public abstract class List {
    public abstract int getMaximumSize();
}

public class MyList extends List {
    @Override
    public int getMaximumSize() {
        return 10;
    }
}

我还有另一个例子,我把一个setter放在抽象类中,但现在我忘记了。

3 个答案:

答案 0 :(得分:2)

IMO,这是一种合理的方法(模数设置器。不要用抽象,非抽象或任何​​其他类型的文件来设置。)

这里有一个问题 - 如果你班级的实施者是白痴,会发生什么?考虑

public abstract class List {
    public abstract int getMaximumSize();
}

public class MyList extends List {
    @Override
    public int getMaximumSize() {
        // negative?!?!
        return -10;
    }
}

如果你想避免这种情况,可以这样做:

public abstract class List {
    // this is the method to override
    protected abstract int getMaximumSizeInternal();
    // and this method is final. Can't mess around with that!
    public final int getMaximumSize() {
        int x = getMaximumSizeInternal();
        if (x < 0) { throw new RuntimeException ("Apologies, sub-classer is an idiot"); }
        return x;
}

public class MyList extends List {
    @Override
    protected int getMaximumSizeInternal() {
        // negative?!?!
        return -10;
    }
}

答案 1 :(得分:1)

在这种情况下,我会推荐一个界面,例如

public interface MaxList extends List // or some better name {
    public int getMaxSize();
}

然后是MyList

public class MyList extends ArrayList implements MaxList { 
// The above assumes you want to extend ArrayList. You may extend some other 
// List implementation or provide your own.
    @Override
    public int getMaximumSize() {
        return 10;
    }
}

注意:我假设您要扩展java.util.List的实现。如果不这样做,则MaxList接口无需扩展java.util.List或MyList以扩展java.util.ArrayList

答案 2 :(得分:0)

我认为如果你想让每个孩子都有getter \ setter是可以的。最终,如果它满足您的需求,那就没关系,我宁愿问是否有更好的方法来实现这种行为。