Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象类从实现子类获取参数?_Java - Fatal编程技术网

Java 抽象类从实现子类获取参数?

Java 抽象类从实现子类获取参数?,java,Java,我想知道是否有办法在不破坏封装的情况下做到这一点,我希望抽象类依赖于实现子类中定义的参数。像这样: public abstract class Parent { private int size; private List<String> someList; public Parent() { size = getSize(); someList = new ArrayList<String>(size);

我想知道是否有办法在不破坏封装的情况下做到这一点,我希望抽象类依赖于实现子类中定义的参数。像这样:

public abstract class Parent {

    private int size;
    private List<String> someList;

    public Parent() {
        size = getSize();
        someList = new ArrayList<String>(size);
    }

    public abstract int getSize();

}

public class Child extends Parent {

    @Override
    public int getSize() {
        return 5;
    }

}
公共抽象类父类{
私有整数大小;
私人名单;
公共家长(){
size=getSize();
someList=新的ArrayList(大小);
}
公共抽象int getSize();
}
公共类子级扩展父级{
@凌驾
公共int getSize(){
返回5;
}
}
这难看吗?有更好的办法吗?也许更重要的是,这是个好主意吗

编辑:


这些类是在框架的上下文中创建的,因此默认的无参数构造函数总是被调用的(实际上,父类扩展了另一个类)。size参数仅用于说明目的,我不打算将其用于列表实现。

如果构造函数是您使用的唯一位置
getSize()
,只需将其作为构造函数参数即可

但更重要的是,你为什么关心尺寸?除非您知道有问题,否则只需像其他人一样使用默认大小:

public abstract class Parent {

    private List<String> someList = new ArrayList<String>();

    // use default constructor    
}
公共抽象类父类{
private List someList=new ArrayList();
//使用默认构造函数
}

不,它并不难看。此模式名为“模板方法”。但通常,当方法不是简单的getter而是实现业务逻辑的东西时,它更有用

在您的情况下,另一种解决方案是在父类中定义受保护的构造函数,并使用子类中的相关参数调用它:

public abstract class Parent {

    private int size;
    private List<String> someList;

    protected Parent(int size) {
        this.size = size;
        someList = new ArrayList<String>(size);
    }

    public int getSize() {
        return size;
    }

}

public class Child extends Parent {
    public Child() {
        super(5);
    }
}
公共抽象类父类{
私有整数大小;
私人名单;
受保护的父级(整数大小){
这个。大小=大小;
someList=新的ArrayList(大小);
}
公共int getSize(){
返回大小;
}
}
公共类子级扩展父级{
公共儿童(){
超级(5);
}
}

模式并不难看,除非您尝试在构造函数中使用它。它允许您以意外结果的方式修改子对象

public class Child extends Parent {

    private int mySize = 5;

    @Override
    public int getSize() {
        // The -1 is only to help clarify what happens
        return mySize - 1;
    }

}

如果您现在创建一个Child实例,它实际上会抛出一个异常,因为不允许负容量。您应该认识到,类的属性只有在父构造函数完成后才初始化。(如果属性是使用父构造函数设置的,并且在Child中定义了一个默认值,那么它将很高兴地覆盖您刚才在Parent()中设置的值)

对不起,我应该进一步澄清,这些类是在框架的上下文中创建的,因此默认的无参数构造函数总是被调用的。size参数仅用于说明目的,我不打算将其用于列表实现。嗨,AlexR,谢谢你的回答,但这种方法有一些含义,我没有足够快地提到,我已将它们编辑到我的问题中。很抱歉