配列の長さのような最終変数の値を設定することはできません(私は推測します)。
Object[] items = new Object[10];
//Not allowed
Object.length = 3;
クラスで読み取り専用フィールドとして使用しても問題ありませんか。
「OK」の意味によって異なります。変更できない理由items.length
は、それlength
が読み取り専用フィールドであるためです。配列が作成されると、そのサイズは固定されます。指定した「許可されていない」行items
は、として宣言されているかどうかに関係なく無効になりますfinal
。
変数を作成items
することは、変数の値を変更して別の配列を参照することができないことを意味するだけであることを理解することが重要です。変数値は参照であり、配列自体ではありません。変数が参照する配列を変更することはできませんが、配列の内容は変更できます。final
// Entirely valid...
items[0] = new Object();
本当に不変なものが必要な場合は、配列を使用できません。
C# のreadonlyと Java のfinalは、多かれ少なかれ同じです (少なくともフィールドに適用される場合)。フィールドを final としてマークすると、変数の初期化またはオブジェクト コンストラクターのいずれかによって一度割り当てられると、コンパイラーはその参照を変更することを許可しません。
ただし、参照しているオブジェクトの内容を次のように変更することはできません。
public class Person {
public final String name;
public final Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
}
//Someplace else
Person peter = new Person("peter", new Address("Dolphin Cove 993", "Stamford", "CT");
peter.address.state = "CA"
フィールド「住所」が最終の場合でも完全に有効です。
また、リフレクションによって簡単に破られる可能性があるため、何らかの種類の「セキュリティ」または何らかの値への強力なアクセス制限を構築するためにfinalに依存しないでください。(http://stackoverflow.com/questions/4516381/changeing-private-final-fields-via-reflection)
このすべての説明はおそらく必要ありませんが、誰かが役に立つと思うかもしれません
乾杯、クラウディオ
すべてのインスタンス変数を非公開にして、メソッドなどの「ゲッター」を使用することを好む人もいますgetLength()
が、それは本当に個人的な好みです。public final フィールドに決定的な問題はありません。それはただのスタイルです。個人的には、非常に単純なクラスに使用することがあります。
確かに、それを読み取り専用として公開する方法は、メンバー変数 'items' をクラス内でプライベートに保ち、パブリック getter メソッドを公開することです。何かのようなもの:
public int getNumItems() {
return (items == null ? 0 : items.length); //includes null handling using ternary operator
}