2

Functional Java ライブラリのソース コードを読んでいて、次のことに気付きました。

public static <T> Option<T> none() {
    return new None<T>();
}

特に None の等値実装のために、なぜそれらが常にシングルトンパラメーターを返さないのか疑問に思っていました:

private static final class None<A> extends Option<A> { 

...

@Override
public int hashCode() {
    return 31;
}

@Override
public boolean equals(Object obj) {
   if (this == obj)
      return true;
   if (obj == null)
      return false;
   if (getClass() != obj.getClass())
      return false;
   return true;
}

}

そこで、Functional Java のフォーラムで検索を行ったところ、次の質問と回答が見つかりました。

none を呼び出すたびに新しい None を作成しないように設定することはできますか?

いいえ、しかし、誰が気にしますか?JIT オプティマイザーは、最近ではこれらのことを非常にうまく処理できます。

私の質問は、シングルトンを返す必要がないように、JIT オプティマイザーがこれをどのように処理するかです。オブジェクトの作成が安いことは知っていますが、シングルトンの方が安いと思います。この場合、複雑さは追加されません。

4

2 に答える 2

3

いいえ、私が知っている Java VM はそのような最適化を実行しません。最新の JVM では、既存のオブジェクトを探すよりも、新しいオブジェクトを作成する方が実際には安価です。また、この FAQ で意味することは、存続期間が短く、使い捨てのオブジェクトはガベージ コレクションの時間に実際には影響しない (ただし、GC の頻度が高くなる可能性がある) ということです。また、JVM がエスケープ分析を実行し、そのようなオブジェクトをヒープではなくスタックに割り当てることも想像できます。

でも、かなり無駄だと思いますjava.lang.Integer(および他のすべてのプリミティブ ラッパー) キャッシュまたはGuavaOptional.absent()を確認します。

public static <T> Optional<T> absent() {
  return (Optional<T>) Absent.INSTANCE;
}

JDK には、このような最適化が他にもたくさんありますenum。s はシングルトンであり、Collections.emptyList()常に同じインスタンスを返すなどです。

于 2013-02-05T19:37:04.523 に答える
1

それはよりタイプセーフです、さもなければ私達は消去に頼る必要があります。

オブジェクトの作成は、キャッシュされたオブジェクトを検索するよりもおそらくまだコストがかかります。java8のオプションを参照してください。

http://hg.openjdk.java.net/lambda/lambda/jdk/file/ad394630273b/src/share/classes/java/util/Optional.java

   43     private final static Optional<?> EMPTY = new Optional<>();

   63      * There is no guarantee that it is a singleton.

   69     @SuppressWarnings("unchecked")
   70     public static<T> Optional<T> empty() {
   71         return (Optional<T>) EMPTY;
   72     }
于 2013-02-05T20:59:04.007 に答える