1

私はLong変数を持っています、

private Long m_prevPacketRecvdTime = null;

今、私はそれのためのセッター/ゲッターのペアを持っています、

    public void setM_prevPacketRecvdTime() {
        if (this.m_prevPacketRecvdTime == null) {
            this.m_prevPacketRecvdTime = new Long(System.currentTimeMillis());
        } else {
            // Why to create a new Object every time
                    //Why I can't just set the new value
                    //Why use new operator here instead of an Assignment or set method call
        }
    }

従来のセッターメソッドの代わりに、1。Longの代わりにlongを渡す、2。新しいLongを1回だけ作成し、残りの時間は既存のLongオブジェクトに新しい値を設定するだけで改善しようと考えました。しかし、私の信じられないことに、 Longにはそのような方法はありません。

値を変更するたびに、本当に新しいLongオブジェクトを作成する必要がありますか?既存のLongオブジェクト(longvalue()の正反対)に新しいlong値を設定するにはどうすればよいですか?

詳細 答えを探しているときに、似たような機能を持つAtomicLongにも出くわしましたが、それが私にとって役立つかどうかはわかりません。彼らは明らかにAtomicLongを「Longの代わりとして使用することはできません」と言っているからです。

4

2 に答える 2

6

あなたはできません、そしてそれは意図的です。不変オブジェクトには、スレッドセーフ、使いやすさ、セキュリティ、予測可能性など、多くの利点があります。その他の理由については、Effective Javaの項目15を参照してください。ただし、Javaのラッパークラスはすべて不変です。

とはいえ、一般的に使用される値をキャッシュすることを知っているので、Long.valueOf(long)の代わりに(またはオートボクシング)を使用する必要があります。new LongLong.valueOf

Javaでは割り当ては比較的安価です。あまり気にしないでください。独自のカスタム可変ラッパータイプへの切り替えが追加のコード複雑度の価値があることを証明するための難しい数値を生成できる場合は、それを実行しますが、従来の不変ラッパーは完全に保守可能です。

于 2012-05-17T06:49:34.467 に答える
2

パフォーマンスが最も重要な側面である場合は、次のことを考慮する必要があります。

private long m_prevPacketRecvdTime = 0;

public void setM_prevPacketRecvdTime() {
    if (this.m_prevPacketRecvdTime == 0) {
        this.m_prevPacketRecvdTime = System.currentTimeMillis();
    }
}

高速であるだけでなく、シンプルでもあります。「設定されていない」を意味する「特別な値」0に注意してください。時間のフィールドについては、大丈夫だと思います。

考慮すべきもう1つの項目は、の使用ですSystem.currentTimeMillis()。これは比較的遅い操作であり、(を使用して)新しいオブジェクトを割り当てるよりもさらに遅くなる可能性がありますnew Long()。これを改善するのは少し注意が必要です。1つのオプションは、別のスレッドで現在の時刻を最新の状態に保つことです。

while (!stopped) {
    Thread.sleep(100);
    currentTime = System.currentTimeMillis();
}

そして、System.currentTimeMillis()毎回呼び出す代わりに、代わりに(静的)フィールドにアクセスしますcurrentTime

于 2012-05-17T07:06:16.943 に答える