4

私の質問は、空の文字列定数を作る価値がありますか? .

定数には意味のある名前を付ける必要があることは知っていますが、次のような定数ファイルでJavaのintのようなプリミティブ値を抽出することに利点はありますか?

public final static int ZERO = 0;

汎用定数として使用Constants.ZEROし、コードベースのように再利用し続けるか、リテラル値 0 をより適切に使用しますか?

汎用ブール値はどうですか? すなわち

public static final boolean TRUE = true;
public static final boolean FALSE = false;
4

8 に答える 8

7

定義している定数については、特別な意味がないため、理由はありません。リテラル0true、およびfalseはすでに意味を持っています。

次のように、それらの値に付加する特別な意味がある場合、定数を作成する価値があります。

public static final int SUCCESS = 0;
public static final boolean DEBUG = true;

これらの値の背後には意味があり、変更される可能性があります。

public static final int SUCCESS = 1;
public static final boolean DEBUG = false;

これにより、プログラム内の多くのリテラルを変更するよりも値を変更する方が簡単になります。

値がリテラル値を超えた意味を持つ場合、および値が変更される可能性がある場合は、定数を作成する価値があります。

于 2013-10-24T00:11:45.837 に答える
2

定数に名前を付けるには、2 つの非常に適切な理由があります。一番の理由は、値を直接参照するのではなく、定数 (Pi、EarthDiameter、SpeedofLight、AvagadroNumber など) に名前を付けてコードを明確にすることです。もう 1 つは、定数と見なされますが、仕様の変更により変更される可能性がある数量を指定することです (例: MAX_CHILD_THREADS、BtreeRadix)。ただし、これらの定数の定義を 1 つの場所に配置すると、将来のニーズに合わせて値を修正することが容易になります。

あなたが言及した定数(0、1、true、falseなど)に名前を付けると、すでに意味があります。定数 0 をゼロに指定しても、実際には何も追加されません。リテラルが "" であるだけでなく、EmptyString と言うつもりだったという追加の意味を提供しているため、空の文字列 "" に名前を付けることに小さな価値があります。

Linux/Unix の errno.h のように、多くのシステムでは数値が意味を持つように定義されており、特定の整数にシステム全体の意味を与えています。したがって、次のような定義には価値があります。

public static final int SUCCESS = 0;
public static final int EPERM = 1; // Operation not permitted
public static final int ENOENT= 2; // No such file or directory
public static final int ESRCH = 3; // No such process
public static final int EINTR = 4; // Interrupted system call

これらの名前を使用すると、開発者の意図が明確になるためです。

于 2013-10-24T00:36:22.363 に答える
1

プログラムの理解や保守が容易になるのであれば、そうです。そうでなければ、いいえ。

HotSpot VM は、どちらの方法でも、コードを同じマシン コードに準拠させる可能性があります。

ちなみに、Boolean.TRUE と Boolean.FALSE は既に存在します。

于 2013-10-24T00:12:45.077 に答える
1

NUM_EXCEPTIONS_TO_TOLERATEあまり伝わらないので、単純な ZERO よりも、定数 0 ( のような) にコンテキスト固有の名前を付ける方が便利です。

ブール値に関しては、変数名はコンテキストを伝えるため、それらを定数として定義する意味はあまりありません。

スペースが心配な場合は、時期尚早の最適化が多すぎると思います。

于 2013-10-24T00:13:03.297 に答える
1

ブール定数はすでに存在しBoolean.TRUEBoolean.FALSE.

そのような定数は、コードにハードコーディングすることが明らかでないマジックナンバーの場合にのみ使用します。

private static final int SECS_PER_DAY = 86400;

したがってZERO、それ自体にはあまり意味がありません。

于 2013-10-24T00:13:12.950 に答える
0

すべてはコードの可読性に帰着します。その良い指標 - 「WTF ?!?!」の数 あなたのコードを読んでいる人による 1 分あたり。

定数の不適切な使用 - 自明なことの文書化:

// yeah, that we have bigger problems if that changes...
public static final String WORLD_WIDE_WEB_PREFIX = "www";

別の例 - 単純な値が同じくらい意味のある定数を代入します。

// to be used in exactly 1 place
private static final int RETRY_COUNT = 3;
// ...
// ... 480 lines later ...
// ...
public int getRetryCount() {
  // what's the value of this thing again?
  return RETRY_COUNT;
}

ただし、前の例では、値 3 を複数の場所で使用する予定がある場合は、定数の方が適しています。これにより、その数値のすべての参照が同期されていることが保証されます (3 から 5 に変更すると、それらはすべて変わります)

一方で、

// what's 143?!?! where do I go looking for what it means?!?!
complexPart.setType(143);
于 2013-10-24T00:59:39.247 に答える
0

ZERO、FALSE、TRUE の値が変わるとは思えません。さらに、FALSE と TRUE は Boolean クラスで定義されています (ただし、プリミティブとしてではありません)。

于 2013-10-24T00:11:49.110 に答える
0

そのような定数を使用して、「マジック ナンバー」がコードを散らかさないようにします。つまり、コードの可読性が重要であるため、明らかにランダムな 33、57、98 などよりも SOME_SIGNIFICANT_NUMBER の方が優れています。

また、複数の場所で参照すると、メンテナンスが容易になる場合があります。つまり、すべてが同じ定数を使用している場合、100 個のリテラルを変更する必要はありません。

于 2013-10-24T00:12:24.357 に答える