3

、、などfinalの Java での構文の使用に関連するオフィス クエリがありました。HashSetListSet

更新したいユーザー名のリストがあるとします。リスト自体は再初期化されず、値が変更されるだけです。

次に、usernames 変数を a にするかどうかという問題が提起されましたfinal

private static final List<String> USERNAMES = new List<String>();
...
USERNAMES.add("user1");

または

private static List<String> usernames = new List<String>();
...
usernames.add("user1");

私の質問は、従来、どちらを使用しますか?

リストの内容を変更できるため(リストインスタンス自体を変更できない場合)、変更できないことを意味する大文字はここでは無効であるという議論を提起できます。したがって、実際には定数ではありません。

同様に、 は変更できないと言ってもlist過言ではありません。したがって、大文字の &finalは問題ありません。

考え?Java 規約は何と言っていますか?

私は本当に答えに興味があり、これは質問だと思います。Java 規約には、これに関するスタンスまたはコメントが必要です。

4

4 に答える 4

2

それを as と宣言するfinalことは、良いアプローチかもしれません。final基本的に、変数の参照を別のインスタンスに変更することは許可されていないことを示しています。

ただし、 には注意してstaticください。static変数は、すべてのインスタンスが同じ参照を共有することを意味するクラス変数になります。場合によっては、これは完全に間違っている可能性があります。各インスタンスにユーザー名の独自のインスタンスが必要な場合は、それを作成したくありませんstatic

于 2012-08-31T06:05:20.527 に答える
1

大文字は、通常、プリミティブまたは文字列である定数を意味するために使用されますが、オブジェクトを参照する場合もあります。実際には、リストなどの基本的なデータ構造として表示されることはめったにありません。この場合、大文字を使用するのは悪い形式だと思います。

変数をマークする適切性はfinalコンテキストに依存しますが、これは定数に使用されますが、これが唯一の用途ではありません。リストが二度と割り当てられないことが適切な場合は、小文字の末尾を使用します。

private static final List<String> usernames = new List<String>();

行くのが最善の方法でしょう。

于 2012-08-31T06:06:34.403 に答える
-1

リストを最終としてマークしても、リストを変更できなくすることはありません。むしろ、それをfinalとしてマークすると、再初期化できないようになります。

変更できないリストが本当に必要な場合は、GuavaのImmutableListを確認することをお勧めします。

これは、ImmutableListのドキュメントからの抜粋です。

変更可能な個別のコレクションのビューであるCollections.unmodizableList(java.util.List)とは異なり、ImmutableListのインスタンスには独自のプライベートデータが含まれており、変更されることはありません。ImmutableListは、パブリック静的最終リスト(「定数リスト」)に便利であり、呼び出し元によってクラスに提供されたリストの「防御コピー」を簡単に作成することもできます。

于 2012-08-31T06:29:22.880 に答える
-1

となると

最終キーワード

Java コレクション (マップ、セット、およびリスト) のコンテキストで Java の コレクション/コンテナが変更可能/変更不可能であると言うとき、それは実際にはその内容を変更できない/変更できないことを意味します。したがって、それらを最終的に宣言することは、実際にはそのコレクションへの参照は変更できないことを意味しますが、コレクション自体は変更可能です。それらを変更できないようにしたい場合、あなたがしなければならないことは、

UnmodifyableCollection<T> {

  public boolean add(T t){
    throw new  UnsupportedException();
 }

  public T remove(T t){
    throw new  UnsupportedException();
 }

}

上記のような内容の追加/削除は許可されていません。Collections.unmodifyXXX()メソッドは同じことを行います。

また、最終的なキーワードには、次のような幅広い用途があります

1) サブクラス化を制限する (クラスを不変にする)

2) メソッドのオーバーライドを制限するには

3) 定数を定義する

コンテナーはすべてのオブジェクトで使用できるため、 static final を使用してコレクションを宣言する場合も注意してください。そのデザインが本当に必要かどうかを確認し、なぜそれが必要なのかを確認してください。

于 2012-08-31T06:20:15.767 に答える