バックグラウンド:
長いコード片からメソッドを抽出すると、プリミティブ変数で値渡しの問題に遭遇することがよくあります。呼び出し元が変更を確認できるように、抽出されたメソッドでこれらのプリミティブ パラメーターを変更することはできません。プリミティブ変数を要素が 1 つだけの配列にすることで、これを回避できます。次に、参照渡しで効果的に使用されます。ただし、現在はヒープ上のオブジェクトです。Java のエスケープ解析は、それを理解して、それにもかかわらずスタックを使用するほど賢いのでしょうか?
次のコードとケースを指定すると、インライン化できませんでした:
public class EscapeAnalysisTest {
public static void main(String[] args) {
final Set<Integer> integers = new HashSet<>();
integers.add(1);
integers.add(9);
integers.add(8);
integers.add(4);
// and so on ...
final long[] product = new long[1];
final long[] sum = new long[1];
final long[] count = new long[1];
final int[] max = new int[1];
final int[] min = new int[1];
product[0] = 1L;
max[0] = Integer.MIN_VALUE;
min[0] = Integer.MAX_VALUE;
for (Integer i : integers) {
calcSomeValues(product, sum, count, max, min, i);
}
System.out.println("Product :" + product[0]);
System.out.println("Sum :" + sum[0]);
System.out.println("Count:" + count[0]);
System.out.println("Max:" + max[0]);
System.out.println("Min:" + min[0]);
}
private static void calcSomeValues(final long[] product, final long[] sum, final long[] count, final int[] max,
final int[] min, Integer i) {
product[0] *= i;
sum[0] += i;
count[0]++;
max[0] = Math.max(max[0], i);
min[0] = Math.min(min[0], i);
}
}