プロが教える店舗&オフィスのセキュリティ対策術

Stringと配列、それぞれlengthがありますが、
Stringはlength()とカッコが付き、配列の場合、例えば
intarray.lengthのようにカッコが付きません。

両者でなぜ扱いが違うのか、教えていただけますか?

A 回答 (4件)

Stringクラスのlength()は「メソッド」です。


メソッドなので「()」(カッコ)が付きます。

配列の場合は…うまく解説してあるページを探したのですが…見つかりませんでした。
↓厳密には違いますが、以下のような説明でうまく伝わるでしょうか?
配列もオブジェクトです。
lengthは「publicでfinalなインスタンス変数」なので「()」(カッコ)が付かない。
↓のような感じのクラス
public class 配列{
  public final int length;
  public 配列(int len){
    length = len;
  }
}
    • good
    • 0

まず、どちらも「length」という名前で似たような機能ですが、無関係であると考えてください。

『「length」というものがまずあって、それはjava.lang.Stringにも配列にも使える』、ということではありません。

カッコがついているものはメソッドの呼び出しで、カッコがついていないものはフィールドの参照です。java.lang.String#length()はメソッドですが、配列のlengthはフィールドです。したがって使うときの構文が違います。

Javaが注意深く設計されていれば、もっと一貫性のある定義になっていたかもしれません。言語によっては「文字列」は「文字の配列」で文字列を配列のとして扱え、その長さも配列とまったく同じ構文で参照できるものもあります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

なぜ配列には length()メソッドを用意せずに、lengthフィールドを
直接参照する仕様にしたのか、不思議に思っています。

何か技術的な問題点があったのでしょうか?
どなたかご存知の方おりましたら、教えてください。

お礼日時:2007/11/15 11:04

>なぜ配列には length()メソッドを用意せずに、lengthフィールドを


>直接参照する仕様にしたのか、不思議に思っています。

配列長の仕様と配列の利用頻度によってそう決めたのでは?というのが自分の考えです。

配列はインスタンスの生成時にその長さが決まり、変更はできません。
つまり、値が固定化されているので、メソッドのように何らかの処理をして値を取得する必要はなく、
フィールドの値で十分管理できます。
これをメソッド化しても、フィールドの値を取得するだけの実装で十分だと思われます。
なので、メソッド化すると、余分なオーバーヘッドが発生するわけです。

さらに配列は至るところで使用されています。
おそらくStringクラスのメソッド内部でも使用されているでしょう。
それほど利用頻度の高いものだと、ちょっとしたオーバーヘッドであっても、
プログラム全体の処理速度を考えると無視できなくなる可能性はあります。

現在のPCではオーバーヘッドといっても人間が体感できないくらいかもしれません。
しかし、Javaが誕生したのは1995年で、当時のPCは今とは比べられないほど貧弱でした。
おまけに中間言語であり「そもそも遅い」Javaですから、可能な限りの処理速度向上をはかりたい、
という開発者の思惑はあったのかもしれません。
さらに言えば、JavaはPC向けの言語というだけでなく、幅広いコンピュータに搭載可能である、
というのが基本理念であるため、PCよりももっと貧弱な環境でも動作するように考慮する必要があります。

確かに一貫性をもって設計すれば、最初から戸惑うこともないかもしれませんが、
別の考え方をすると、
慣れてしまえばその違いはたいしたことない、むしろそれが処理速度の足枷になるよりはマシだ、
ともいえます。
ただ、この辺は考え方にもよるところですが…

もちろん、自分の考えが正解とは限らないので、本当の所はJavaの開発者に聞くしかないですが…
    • good
    • 2

>何か技術的な問題点があったのでしょうか?



技術っていうより、どうしても嫌なら以下のような独自クラスを作ればいいと思う。

public class array{
 static public void main(String... $0_){
  int[] hairetsu = {0,1,2};

  System.out.println("配列の長さ:" + hairetsu.length);

  arrays intarray = new arrays(hairetsu);
  System.out.println("配列の長さ:" + intarray.length());
 }
}

class arrays{ // SJC-P勉強中の方は、これを無名クラスにしてみよう。
 int[] con;
  arrays(int[] con){
  this.con = con;
 }

 int length(){
  return con.length;
 }
}

>なぜ配列には length()メソッドを用意せずに、lengthフィールドを
>直接参照する仕様にしたのか、不思議に思っています。

仕様っていうより、動作的にそのようになってしまうと思います。#2さんの回答でも納得できないとしたら、オブジェクト指向はまだ始めたばかりでしょうか?

JavaWorld.com
「Study guide: Java's character and assorted string classes support text-processing」
http://www.javaworld.com/javaworld/jw-10-2002/jw …

上記サイト内でも、次のような記述があります。

Confusing length() with length leads to compiler errors. length() is a method that returns the current number of characters in a String's value array, whereas length is a read-only array field that returns the maximum number of elements in an array.

普通にJavaを勉強されてきた方ならば、「あ~そうか、なるほど。」ってなると思うのですが。

ただ、いろいろとググっていたら、どうやら初期のJDKでは配列の要素数取得にlength()メソッドが使われていたとのこと。[JavaHouse-Brewers:5708]

James Goslingさんも、当時はどのように考えていらしたのでしょうかね~。(日本そのものには大変興味があるらしいですが、最近はNintendo DSとか携帯向けのアプリなんかにハマっているそうです。)

参考URL:http://blogs.sun.com/jag/

この回答への補足

今回は明確な理由が添えられた回答が得られなかったので、得点は無しとさせて頂きます。

補足日時:2007/12/02 03:48
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
普通にJavaを勉強されてきた方ならば、「どうして?」ってなると思うのですが。

お礼日時:2007/12/02 03:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!