御懸念のとおり、level 判定の都度 20 個インスタンスを作っていると、19 個は丸々無駄になってしまいます。そんな場合は、配列をクラスの static フィールドに定義してしまえば、クラスロード時に1度だけ 20 個作り、以降ずっと使いまわしていくことができるので、無駄にならずに済みます。
また、C 言語での流儀を受け継ぎ (?)、この手のデータ (テーブル) は2重配列で定義することが多い印象です。結果として、以下のようなスタイルになっているプラグラムを結構見かけます。
public class Clazz {
private static final int[][] table = {
{3, 8, 9, 6},
{1, 9, 6, 1},
......
};
public void method() {
int level = ...
int a = table[level][0];
int b = table[level][1];
int c = table[level][2];
int d = table[level][3];
......
}
}
ちなみに、
\u0026gt; インスタンスの作成の時間やメモリ確保の無駄より、プログラム作成面の分かりやすさや、コンパクトさの方を優先すべきでしょうか?
分かりやすさ重視に1票入れときます。
パフォーマンスについては、それが問題になった時点で考えればいいかな、と思います。