簡體   English   中英

超級之前的java調用方法

[英]java calling method before super

假設我有一個超類,它的構造函數中有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;
    }
}

它似乎有點難看,我想知道是否有更好的解決方案自己使用參數然后定期調用超級。 請注意,我無法更改超類或子類的用法,因此無法更改工廠設計模式

要從構造函數中獲取邏輯,可以在子類中輕松創建工廠方法:

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

在Java中,在調用super之前不允許執行另一個語句。 你提到的技巧有效,但你不能重構你的代碼,以便在調用super之前在語句中調用func

根據我的經驗,這樣的問題經常暗示一些設計問題。 也許你可以通過重新思考這兩個相關類的責任來解決潛在的問題。

您還可以使用構建器模式

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM