簡體   English   中英

我應該將代碼放在Java的哪里?

[英]Where should I put my code in java?

我有一些很費時的代碼,您可以將其視為從磁盤加載數據(但不僅限於此)。 但是我在初始化中只需要這段代碼一次,但是完成后,我可以直接和快速地使用與之相關的一些方法。

現在我不知道該把這段代碼放在哪里,這是我的想法:我將它放在A類的構造函數中,然后放在B類中,該類需要多次調用某種方法,所以我在B的構造函數中創建A的新實例,這是非常理想的,因為每次我需要A的方法時,我都可以直接訪問它,並且A的構造函數僅被調用一次。

但這是問題所在,我還有其他一些類C,它們生成許多B實例(新B()),然后每次C生成B的新實例時,都會調用A的構造函數,這又非常耗時,如何組織代碼來避免這種情況?

請參閱代碼以進行澄清。

class A{
    public A(){
        some time-consuming code; 
    }
    public void methodInA(){
        some method in A;
    }
}

class B{
    public B(){
        A a = new A();
        for (i=0; i<10000;i++)
            methodInB();
    }
    public void methodInB(){
        methodInA();
    }
}
//so far, everything is perfect, but I have another class C 

class C{
    public C(){
        some code;
    }
    public void methodInC(){
        for (i = 0; i<10000; i++)
            new B();
    }

}

方法1:將A類中的方法設為靜態,並在靜態塊中進行初始化。

請參閱此SO answer

class A {
    // if any variable then make them static
    static {
        // some time-consuming code;
    }

    public static void methodInA() {
        // some method in A;
    }
}

class B {
    public B() {
        for (int i = 0; i < 10000; i++)
            methodInB();
    }

    public void methodInB() {
        A.methodInA(); // directly call static method
    }
}

方法2:將A類設為singleton 但這在@BalusC的SO answer not recommended這樣做。

因此,您已經確定了將“耗時的代碼碎片”放入類A的構造函數中的問題。如果經常調用耗時的構造函數,那么如果生成許多類a的Object,則將有一個整體耗時的程序。 以您的情況為例

mehodInC(){ 
    //some code
}

C類將創建10.000個新的B對象,並且由於每個B對象都會在構造函數中自動創建一個A對象,因此您最終將調用該耗時的代碼片段10.000次。

現在這顯然不是最佳選擇,我們如何解決呢? 如果我是你,我會將代碼片段移到方法中,因為它可以讓您更好地控制何時調用它。 (請為進一步的參數調用該方法methTimeConsuming())它還分隔了程序的不同功能。 這有助於最終代碼的整體可讀性。

因此,即使您創建許多對象,也只調用一次耗時的代碼一次的方法是:

A myObj = new A();
myObj.methTimeConsuming();
for(int x = 0; x < 9999; x++){ //9999 because you already called it once outside of for-loop
    myObj = newA();
}

顯然這是一個非常基本的代碼片段,但是可以從那里擴展想法。

暫無
暫無

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

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