String.length() がメソッドであり、int[].length がプロパティであるのはなぜですか (以下を参照)。
int[] nums = {2,4,7,12,43};
String phrase = "Hello, world.";
System.out.length(nums.length);
System.out.length(phrase.length());
正当な理由がある必要はないと思いますし、多くの理由が考えられると思います。
しかし 1 つはString#length()
、プロパティを作成することで、代わりにインターフェイスで宣言できることです (この場合はCharSequence
)。インターフェイスは、パブリック インスタンス フィールドを宣言できません。
String::length()
関数は次のようになります。
public int length() {
return count;
}
したがって、本質的には、配列と同様にcount
呼び出さlength
れて公開される可能性があります (final
結局のところ)。
それはおそらく単なる設計上の決定でした。推測できるいくつかの要因があった可能性があります (そのうちの 1 つはCharSequence
、Mark Peters によって言及された可能性があります)。
特に理由はないと思います。実際、非常によく似た言語である C# にString.length
は、プロパティhttp://msdn.microsoft.com/en-us/library/system.string.length.aspxがあります。しかし、C# デザイナーがこの設計について何と言っているかを見てみましょう。
The Length property returns the number of Char objects in this instance, not the number of Unicode characters.
The reason is that a Unicode character might be represented by more than one Char. Use the
System.Globalization.StringInfo class to work with each Unicode character instead of each Char.
なぜ int[].length がプロパティなのですか?
配列は Java の特別なオブジェクトであり、最終的な長さという名前の単純な属性を持っています。
配列の「クラス定義」はなく (どの .class ファイルにもありません)、それらは言語自体の一部です。
配列のコンポーネントの数を含む public final フィールドの長さ。長さは正またはゼロです。
クラス Object 内の同じ名前のメソッドをオーバーライドし、チェック例外をスローしない public メソッド clone。配列型 T[] の clone メソッドの戻り値の型は T[] です。
多次元配列のクローンは浅いです。つまり、単一の新しい配列のみを作成します。サブアレイは共有されます。
クラス Object から継承されたすべてのメンバー。継承されないオブジェクトの唯一のメソッドは、そのクローン メソッドです。
リソース: JSL 10.7
String は配列そのものではないためです。Java の設計者は、配列 (オブジェクト) を という名前の public フィールドを持つように設計しましlength
た。
一方、String には代わりに長さを与えるメソッドがあります。一般に、メンバー フィールドをプライベートにし、メソッドを使用してそれらにアクセスすることは、より従来のアプローチですが、配列の場合はそうではありません。
あなたに関する限り、それらは異なる署名を持つ異なるオブジェクトです。AString
は a ではありませんchar[]
(ただし、内部的にはそのように実装されている可能性があります)。