java在super之前调用方法

问题描述 投票:0回答:3

假设我有一个超类,它的构造函数中有 3 个参数,并且我继承了这个类,它也有一个有 3 个参数的构造函数,并且我想调用超类构造函数,但在我想对子类执行一些逻辑之前首先,我可以调用一个接收这 3 个参数的静态方法,但我必须只返回一个,所以这是我想出的解决方案

public class someClass extends  SuperClass {
    public someClass(int a,int b,int c) {
         super(func(a,b,c),b,c);
    }
    public static int func(int a,int b,int c){
        //usage a b c
        return a;
    }
}

看起来有点难看,我想知道是否有更好的解决方案自己使用参数,然后定期调用 super 。请注意,我无法更改超类或子类的用法,因此无法更改工厂设计模式

java constructor super
3个回答
10
投票

要从构造函数中获取逻辑,您可以轻松地在子类中创建工厂方法:

public class SomeClass extends SuperClass {
    private SomeClass(int a, int b, int c) {
        super(a, b ,c);
    }

    public static SomeClass create(int a, int b, int c) {
        // calculate a for constructor
        
        return new SomeClass(a, b, c);
    }
}

然后您可以按如下方式创建实例:

SomeClass someClass = SomeClass.create(1, 2, 3);

4
投票

在 Java 中,在调用

super
之前不允许执行其他语句。您提到的技巧有效,但您无法重构代码以在调用
func
之前在语句中调用
super

根据我的经验,此类问题通常暗示着某些设计问题。也许您可以通过重新思考所涉及的两个类的职责来解决根本问题。


1
投票

您还可以使用构建器模式

public class SomeClass extends SuperClass {
    public static class Builder {
        private int a, b, c;
        public Builder withA(int a) { 
            this.a = a;
            return this;
        }
        public Builder withB(int b) { ... }
        public Builder withC(int c) { ... }
        public SomeClass build() {
            // logic goes here
            return new SomeClass(...)
        }
    }

    // hide this from public use, use Builder instead
    protected SomeClass(int a, int b, int, c) {
        super(a, b, c);
    }
}

SomeClass someClass = new SomeClass.Builder().
    withA(1).
    withB(2).
    withC(3).
    build();
© www.soinside.com 2019 - 2024. All rights reserved.