これに関する参考資料はオンラインで見つかりませんでした。しかし、クラスの最後のフィールドが常にあるべきstatic
か、それとも単なる慣例であるかを知りたかっただけです。それらの使用法についての私の理解に基づいて、私はそれが言語によって課される何かよりも論理的なことであると感じます。
8 に答える
もちろん違います。それらがクラスに属している場合は静的である必要があり、クラスのインスタンスに属している場合は静的であってはなりません。
public class ImmutablePerson {
private static final int MAX_LAST_NAME_LENGTH = 255; // belongs to the type
private final String firstName; // belongs to the instance
private final String lastName; // belongs to the instance
public ImmutablePerson(String firstName, String lastName) {
if (lastName.length() > MAX_LAST_NAME_LENGTH) {
throw new IllegalArgumentException("last name too large");
}
this.firstName = firstName;
this.lastName = lastName;
}
// getters omitted for brevity
}
いいえ、絶対にありません-そしてそれは慣習ではありません。
static
まったく違うものですfinal
。フィールドがタイプの特定のインスタンスではなく、タイプに関連していることを意味します。これは、フィールドが初期割り当て後に値を変更できないことを意味します(タイプ/インスタンスの初期化中に発生する必要があります)。static
final
static final
フィールドは通常定数用ですが、インスタンスフィールドfinal
は通常、不変の型を作成するときに使用されます。
それらは常に一緒になるとは限らず、それは慣習ではありません。final
フィールドは、不変の型を作成するためによく使用されます。
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
一方static
、final
フィールドはそれほど一般的ではなく、かなり注意が必要です。アプリケーション1全体の定数static final
を意味するため、よく見られます。
1-正確には、クラスローダー全体。
最終フィールドは静的である必要はなく、非静的の最終インスタンス変数があると便利な場合があります。staticとfinalの両方でマークされたフィールドは、通常、次のように定数に使用されます。
public static final int BORDER_WIDTH = 5;
ただし、オブジェクトに不変のプロパティがある場合、非静的なfinalフィールドが表示されることがあります。ただし、通常、非静的final
フィールドは通常の理由でマークさprivate
れているため、コンパイラがプロパティを二度と設定しないようにするための追加のチェックになります。
のようにそれらにアクセスしたい場合はClassName.FIELD
、はい、そうする必要があります。静的にしない場合は、のようなことを行うnew ClassName().FIELD
必要があります。これは不要であり、オブジェクトを無意味に作成します。
ただし、クラスでのみ使用する場合、または作成する場合private
は、静的にしないでください。あなたが実際のクラスにいるなら、あなたはただすることができますFIELD
。
この概念を完全に理解するには、その意味を知る必要がありますstatic
。静的とは、インスタンスではなく、実際のクラスに属することを意味します。
絶対違う。検討:
class Point {
public final int x;
public final int y;
public Point(int _x, int _y) {
x = _x;
y = _y;
}
}
を削除するfinal
と、クラスは変更可能になります。を追加するstatic
と、すべてのポイントが同じになり、コンストラクターを作成する合法的な方法はありません。
絶対違う。たとえば、不変オブジェクトにはfinal
、コンストラクターによって1回だけ設定できるプロパティがあります。
詳細については、http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.htmlを参照してください。
不変オブジェクトは、final
プロパティが使用される唯一のケースではありませんが、それらの有用性の明白な例を提供します。
答えはいいえだ。
静的
「このクラスのすべてのインスタンスで使用できるデータフィールドは1つだけであることを示します。この修飾子がないと、各インスタンスにデータフィールドの独自のコピーがあります。」
...これは1つしか存在できないことを意味します
最後の
「データフィールドに指定された値は変更できません」
...これは定数であることを意味します