2

私のプログラムの構造は次のとおりです。

void main (String[] args) {
   Object largeObject = longInitialization();
   interestingLogic(largeObject);
}

開発中に longInitialization コードが変更されることはありません。しかし、interestingLogic を変更するたびに、プログラムを再度実行して、longInitialization が完了するのを待つ必要があります。

残念ながら、ラージオブジェクトはシリアライズ可能ではなく、そのためのコードがないため、シリアライズできません。

初期化時間を節約できるトリックはありますか? おそらく、何らかの方法で初期化直後の JVM の状態を保存し、常にその状態から開始するのでしょうか?

4

5 に答える 5

2

You can make little modification of code:

main(){
    Object largeObject = longInitialization();
    boolean debug = true;
    while(debug){
        interestingLogic(largeObject);
    }
}

now run program in debug mode. Set breakpoint at interestingLogic call and use code hotswap debug mode in IDE. read more about hotswap in Eclipe: Java Hotswap with Eclipses and Remote Debugging on Local Machine

//Edit:

One more option. Just write mock of largeObject.

于 2013-03-06T14:54:40.790 に答える
1

InterestLogic(largeObject)を呼び出すには、新しいオブジェクトが必要になります。ドライバプログラムがユーザー入力を待機している間に、新しいオブジェクトに変更を加えることができます。

void main (String[] args) {
Object largeObject = longInitialization();

 boolean anotherTry = true;
 String answer = "";
 Scanner input = new Scanner(System.in);
 while (anotherTry) {
        Object newobject = NewObject();
        newobject.interestingLogic(largeObject).
        System.out.print("Run Again Y/N");
        answer = input.nextLine();
        if (answer.equalsIgnoreCase("N")) {
            anotherTry = false;
        }

    }
}
于 2013-03-06T15:04:38.520 に答える
0

「...largeObjectをシリアル化できません...」と言ったため、JVMの存続期間にわたってオブジェクトを永続化する方法はありません(ソースがないため)。ただし、largeOjectを初期化/使用するコードがあります。実際のlargeObjectのように動作するシリアル化可能なdebugLargeObjectを作成し、開発中にdebugLargeObjectを使用します。

于 2013-03-06T15:05:42.203 に答える
0

大きなオブジェクトがすぐに必要でない場合は、「遅延初期化」ラッパーで装飾し、アクセスする直前に「longInitialization」を呼び出すことができます。

2番目の解決策は、xmlファイルにマーシャリング/アンマーシャリングすることで「複製」することです

于 2013-03-06T14:57:46.703 に答える
0

多くの作業がないわけではありません。Guido で示されているように、マイナーなリファクタリングが必要です。次に、ループ (または何でも) を通過するたびに NewObject クラスをリロードする必要があります。つまり、コードを変更するたびに、VM は NewObject クラスを削除して再読み込みできる必要があります。

これを行う商用製品があります (たとえば、JRebel を参照してください)。独自のロールを作成できます (この StackOverflow トピック: Unloading classes in java?を参照してください)。あなたの興味のあるロジックに細心の注意を払っていれば、ホットスワップできます。しかし、最終的には、何らかの方法でそのクラスを交換する必要があります。

于 2013-03-07T22:07:30.957 に答える