2017-11-07 5 views
1

デフォルトのスタックサイズ制限には大きすぎるグローバル定数ImmutableListを定義しようとしています。攻撃的なXss32Mフラグをjavaに渡す以外の方法があります。ここで巨大なグローバルなImmutableList定数を定義するエレガントな方法(スタックサイズ制限を超えて)

は、コードスニペットです:

import com.google.common.collect.ImmutableList; 
import util.FixedRowDefinition; 
import java.util.List; 

public class FancyConstants { 
    public static final List<Person> student_list = new ImmutableList.Builder<Person>() 
     .add(new Person("Amy",12,56)) 
     .add(new Person("Tom",26,79)) 
     ......... 
     .add(...).build() 

    /* More similar definitions; could be very long */ 
} 

あり、上記のようなおよそ2000行である、と私はクラスが吹く理由は、各要素は、オブジェクト(非常に希薄であるが)であるということですね。

student_listをJavaで定義して、私が現在観察しているようなエラーStackOverflowが発生しないような方法はありますか?

+5

ファイルから読み込みます。 – pvg

+0

あなたはそれをクラスにハードコーディングするべきではありません。それはファイルから来るべきです。 –

+0

@EricWang:メソッドの呼び出しを連鎖させると、各呼び出しは前の*が返された後に*発生します。コード自体はスタックオーバーフローを生成しません。ソースコードの処理中に 'StackOverflowError'が失敗するのは*コンパイラ*です。 – Holger

答えて

3

観察しているStackOverflowエラーは、ビルダーパターンのコールチェーニングによるものです。

public class FancyConstants { 
    public static final List<Person> student_list; 
    static { 
     ImmutableList.Builder<Person> builder = new ImmutableList.Builder<Person>(); 
     builder.add(new Person("Amy",12,56)); 
     builder.add(new Person("Tom",26,79)); 
     ......... 
     /* More similar definitions; could be very long */ 
     builder.add(...); 
     student_list = builder.build(); 
    } 
} 

明らかに、これは非常にエレガントではありませんが、スタックオーバーフローのエラーが修正されています。あなたは、静的初期化子で変数を追加することによって、それを避けることができます。

ファイルからデータを読み込むことで、Javaプログラムにリソースとして埋め込むことができます。

This Q&Aは、埋め込みリソースから読み込む方法を説明しています。あなたのプログラムはリソースの内容を所有しているので、builderに少量のコードを埋め込み、事実上エラーチェックを行うことはできません。

2

元の質問に答えるには、-Jオプションを使用してjavacにJVMオプションを渡すことができます。例えば。私はあなたのコードテンプレートを取り出し、3600の呼び出しの連鎖を作成し、javacを使って-J-Xss10mを使用して正常にコンパイルしました。

しかし、これはプログラムをコンパイルして実行するのに十分ですが(実行に大きなスタックサイズは必要ありません)、このソースコードは、このソースコードをより大きなスタックで処理するように設定されていないIDEサイズ。再帰的にソースコードを解析して処理することはあまりにも一般的です。

また、コンパイルされたコードのサイズはメソッドのサイズの限界に近いため、大きなリストの余地はあまりありません。だから私はこのサイズの定数リストのためのリソースを使うことに回想するのは第二にthis answer’sの勧告しかできません。

関連する問題