OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

StringBufferからStringへキャストする

  • 暇なときにでも
  • 質問No.226044
  • 閲覧数2458
  • ありがとう数7
  • 気になる数0
  • 回答数4
  • コメント数0

StringBufferからStringへキャストする方法としてどちらを用いるのが一般的なのでしょうか
StringBuffer sb
として
public String ***(***)メソッドの最後に

1. return sb.toString()とする
2. return new String(sb)とする

私は1を使っていたのですが、
Javaの規約だか処理能力が良い方法だかに
厳しい人が2を使っていたので少し戸惑う程度ですが…
回答よろしくお願いします。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル6

ベストアンサー率 42% (3/7)

toString()メソッドは全てのClassのスーパクラスであるObjectクラスのメソッドです。
その他のクラスのtoString()メソッドは、これをオーバライドしたに過ぎません。
toString()メソッドの用途はそのオブジェクトを視覚的にあらわすときに利用します。オブジェクトのダンプイメージです。
今回はStringBufferクラスのtoString()メソッドのためダンプイメージがStringそのもののため問題ありませんが、
「Stringにキャストする」と明示的に処理するには2を使用するのが正解と思います。
格クラスのtoString()メソッドはDEBUGで画面やファイルに出力するときに使用すると考えたほうが賢明と思います。
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル11

ベストアンサー率 47% (160/334)

以下の2つのクラスを作って簡単に実験してみました。 ========== class STest1 { public static void main(String[] args) { System.out.println(getString(args[0])); } static String getString(String str) ...続きを読む
以下の2つのクラスを作って簡単に実験してみました。

==========
class STest1
{
public static void main(String[] args)
{
System.out.println(getString(args[0]));
}

static String getString(String str)
{
StringBuffer sb = new StringBuffer(str);
return sb.toString();
}
}
==========
class STest2
{
public static void main(String[] args)
{
System.out.println(getString(args[0]));
}

static String getString(String str)
{
StringBuffer sb = new StringBuffer(str);
return new String(sb);
}
}
==========

バイトコードのサイズは,STest1.classが605バイト,STest2.classが627バイト。これをそれぞれ javap -c してみると,当然ですが違いはgetString()メソッドの最後の方だけで,STest1のほうが,

8 astore_1
9 aload_1
10 invokevirtual #7 <Method java.lang.String toString()>
13 areturn

であるのに対し,STest2のほうは,

8 astore_1
9 new #7 <Class java.lang.String>
12 dup
13 aload_1
14 invokespecial #8 <Method java.lang.String(java.lang.StringBuffer)>
17 areturn

となっていました。これを見るかぎり,toString()を使ったほうが効率が良く,new String() を使うメリットは何も考えられないのですが…。


  • 回答No.2
レベル1

ベストアンサー率 0% (0/2)

StringBufferソースを見ると、 return new String(sb); のようにtoString()がオーバーライドされていたと思います。 厳しい人が2を使っていたというのは、 その方が正確・・・というか、理解しやすいからでしょう。 1を使う人は、StringBufferのtoString()が、 オーバーライドされているということを知らない人が多いと思います。 ちなみに ...続きを読む
StringBufferソースを見ると、
return new String(sb);
のようにtoString()がオーバーライドされていたと思います。

厳しい人が2を使っていたというのは、
その方が正確・・・というか、理解しやすいからでしょう。
1を使う人は、StringBufferのtoString()が、
オーバーライドされているということを知らない人が多いと思います。
ちなみに、私も2の書き方をします。

また、バイトコードのサイズを比較されていた方もおられますが、
現在はHDDもメモリも安価になり、大量に積んでいるマシンが多いため、
あまり気にすることはないように思います。

sb.toString()を使ってtoString()内部で何がされているかわからないよりも、
new String(sb)として、Stringオブジェクトを返しているという明示的なわかりやすさを得る方がいいと思います。
  • 回答No.4

参考URLに、この問題についての議論が行われています そこでも議論されているように正しいのは2の方だと思います。 未だにJava自身のソースや「プログラミング言語Java 第3版」の中でも、sb.toString()が 例として上がっているようですが。 ちなみに、個人的に1を使っていました。 1つ勉強になりました ...続きを読む
参考URLに、この問題についての議論が行われています

そこでも議論されているように正しいのは2の方だと思います。
未だにJava自身のソースや「プログラミング言語Java 第3版」の中でも、sb.toString()が
例として上がっているようですが。

ちなみに、個人的に1を使っていました。
1つ勉強になりました
お礼コメント
noname#6248

まとめてのお礼になり申し訳ないです。

皆様の意見を私なりに解釈してこうなりました。

・String toString()はObjectメソッドを継承しているクラスなので戻り値がStringである事はJavaをそこそこ触れれば誰もがわかる
・str = strinBuffer.toString();がたまたまStringへキャストした値を返していた。
・newを使用するよりも動作的にも早かった。
と言う理由で(1)が浸透してしまった(orしつつあった)

しかし、strinBuffer.toString();が将来#StringBuffer:6542154等ということになりかねないし、StringBufferクラスを継承させて使おうものならtoString()オーバーライドされればTheEnd…
その点、new String(StringBuffer)ならば確実にキャストされる。
ですので(2)を使用するのが正しい…

atonさん、web5さん、bo-kenさん、spoonyさん、本当にありがとうございました。
投稿日時 - 2002-03-08 14:07:09
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ