21

これは明らかな質問かもしれませんが、次のコードを見ています。

private Date lastActivity = new Date(-1);

そして、これが何をするのか興味があります.Dateクラスには6つの異なるコンストラクタがあり、そのうちの1つだけが単一の引数を取ることができますlong.

public Date(long date)

どれの:

Date オブジェクトを割り当て、それを初期化して、「エポック」と呼ばれる標準の基本時刻 (1970 年 1 月 1 日 00:00:00 GMT) からの指定されたミリ秒数を表します。

-1 は単なるプレースホルダーですか? ヒントやアドバイスをいただければ幸いです。

4

4 に答える 4

19

January 1, 1970, 00:00:00 GMT マイナス 1 ミリ秒です(負の数はエポックの始まりより前の日付です)

于 2012-06-03T20:21:17.287 に答える
17

通常、これを行うのは、おそらく検証または比較 (すべての「実際の日付」はこれよりも大きい) のために、「よく知られている」日付を取得するためであり、「マーカー オブジェクト」として、日付が本当に不明/違法/保留であることを示します。しかし、何らかの理由で、またはおそらく単体テストのために null を使用したくない場合があります。

OK、私が「マーカー値」と呼んだもののより適切な用語を調べると、センチネル値、フラグ値、トリップ値、ローグ値、シグナル値、またはダミー データが得られます。こちらのウィキペディアの記事を参照してください

于 2012-06-03T20:16:49.193 に答える
5

-1 は単なるプレースホルダーですか? ヒントやアドバイスをいただければ幸いです。

おそらく、プレースホルダーという用語が通常使用されるという意味ではありません。(それは…を表すもの、または…の場所を保持する何か他のものです。)

計算上の境界条件を表す値である可能性が高くなります。この特定のケースでは、変数名lastActivityはこれを暗示しているようです。これは、「アクティビティ」の最新時間を決定するアルゴリズムの一部であると想像できます...そして、Date(-1)オブジェクトは「アクティビティが発生しなかった」ことを意味すると見なされます。またはフラグを使用してこれを表すこともできnullますが、「ファンキーな」Date オブジェクトを使用すると、おそらくアルゴリズムのロジックが少し単純化されます。

「センチネル値」はこれに適した用語ですが、「マーカー値」はあまり良くありません。実際には何もマークしていないからです。

(ある意味で、 の選択-1は恣意的です。アルゴリズムが遭遇する可能性のある時点に対応していなければ、任意の値にすることができます。-1時点が常にUNIX エポックの後... 1970 年 1 月 1 日。しかし、潜在的に歴史的な日付を処理する必要がある場合は、おそらくLong.MIN_VALUEより良いでしょう.いずれにせよ...これはすべて、宿題のコンテキストでは意味がない可能性があります.)

于 2012-06-04T02:00:28.013 に答える
4

これをセンチネル値と呼びます。そのポイントは、通常、データが利用できないこと、一連のデータが終了したことなどを示すことです。明らかに無効な特定の値を使用することで、別のisValidorisFinishedフィールドを維持する手間を省くことができます。

これが良い習慣であるかどうかについては、意見が分かれています。\0C 文字列を終了するASCII のように、規則が非常によく知られている場合、一般に受け入れられます。他の状況では、将来「有効」と見なされるものの範囲を拡大する可能性があり、レガシー データを扱う際に窮地に追い込まれます。また、単一責任の原則にも違反しています。データの一部が 2 つのかなり異なる情報を表す可能性があるため、コード リーダーは隠された潜在的な特別な意味に気付かない可能性があり、型システムはそれを発見するのに役立ちません。 .

于 2012-06-04T06:13:39.850 に答える