Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

int型の変数をStringにしてreturnする

色々調べてはみたのですが、これだ!というものが
見つけられなったので、みなさんの意見を頂きたいです。

int型変数をStringにして返すメソッドを作成したのですが、
その際のreturnの書き方について
【1】return int.toString();
【2】return String.valueOf(int);
【3】return (String) int;
のいずれでも問題なく動作はするのですが、
どれが一番適当なのでしょう?

returnは一時的にキャストすれば良いだけだから?と考えて【3】を使ったのですが、
【1】と【2】については
【1】ラッパークラスで用意されてるtoStringメソッド
【2】Stringクラスで用意されているvalueOfメソッド
という違いだけで、好みで使えばいいものなのでしょうか?
キャストを使うタイミングが掴みきれない私です。

よろしくお願いします。

21

回答

13138

閲覧

21件の回答

評価

0

>【1】return int.toString();
>【2】return String.valueOf(int);
>【3】return (String) int;
>のいずれでも問題なく動作はするのですが、
>どれが一番適当なのでしょう?

えっっ
1と3はコンパイルすら通らないと思うんだけど・・
もしかして俺の知識が後れてる?

評価

0

Java1.5.0から、型変換を自動で行ってくれる機能が実装されたので、
【1】【3】でもエラーにはならないのです。
紛らわしい書き方してしまってすみません。

【1】Object型とStringに変換
【2】プリミティブ型をStringに変換
というだけの違い?本当にそれだけなの?
と思い質問させて頂きました。
↑この違いだけだと、Java1.5.0以降では動きが変わらないような感じがしまして…

評価

0

>1と3はコンパイルすら通らないと思うんだけど・・
intがIntegerだったら、1も通りますね。

    public static void main(String[] args) {
        int i = 0;
        Integer j = 0;

        String str1 = (String) i;           // コンパイルエラー
        String str2 = String.valueOf(i);    // OK
        String str3 = i.tostring;           //  コンパイルエラー

        String str4 = (String) j;           // コンパイルエラー
        String str5 = String.valueOf(j);    // OK
        String str6 = j.toString();         // OK

    }

評価

0

自動型変換なんてできるようになってたんですね。
勉強になります。

動きが変わらないのなら、

--さんや私が勘違いしたことを考えて、String.valueOfメソッドを使うのがいいんじゃないかなぁと。

#暗黙的な型変換なんて気持ち悪いって思うのって、古い考えなのでしょうか?

評価

0

やっぱ納得いかなかったのでコード書いてきた。
恋さんの書いた事を忠実に再現すると下記のようなコードだよね?

1:public class Test {
2:  public static void main (String[] args) {
3:    int x = 0;
4:    x.toString();     // 1
5:
6:    String str = x;   // 3
7: }
8:} 


Autoboxing/Auto-Unboxingについてはそれなりに把握してるし
自分の環境 javac 1.6.0_21 だけと↓のような感じだよ。
それとも俺が何か勘違いしてるかな?
------------------------------
Test.java:4: int は間接参照できません。
        x.toString();
         ^
Test.java:6: 互換性のない型
検出値 : int
期待値 : java.lang.String
        String str = x;
                     ^
エラー 2 個
------------------------------

これだけだとなんなので回答しとくと
【2】でいいんじゃないかな。

それと1〜3まで全部出来ると仮定すると
1と2はキャストとは言わないんじゃないかな。
キャストっていう言葉の正確な定義はしらんけど。

評価

0

>2010-11-30 11:18
>Java1.5.0から、型変換を自動で行ってくれる機能が実装されたので、
>【1】【3】でもエラーにはならないのです。
auto-boxingに過剰な期待をしている。
すでに検証が出ているから詳しいことは書かないけど。

.NETなら確か全部通るね。ただしtoString()ではなくToString()だけど。

私は
return "" + x;
だなー。


>2010-11-30 11:38 
>#暗黙的な型変換なんて気持ち悪いって思うのって、古い考えなのでしょうか? 
暗黙の型変換なんて昔からあるじゃん。

評価

0

>私は
>return "" + x;
>だなー。

なん・・だと・・?
自分も↑結構使ってるけど行儀の悪い書き方だと思ってた。
というか思ってる。(根拠はまったくない)

他の人の意見も聞いてみたいな

評価

0

はて?とソースを見直し
物凄く激しくうっかりしていたことが発覚しました。

>int型変数をStringにして返すメソッドを作成したのですが、
int型変数だと思っていたものがString型の配列でした…orz
そりゃ【1】も【2】も【3】も通りますよね…orz
大変失礼いたしました…orz
穴があったら埋まりたい…orz

1レス目で--さんがおっしゃっている通り
問題に挙げたint→Stringの型変換は
【2】String.valueOf(int);
でないとコンパイルエラーです。
【1】IntegerならOKだけどintのままでは無理
【3】Object型とプリミティブ型じゃキャスト不可
…ということで…orz


くじけずに頂いた回答を元に質問します。

>--さんや私が勘違いしたことを考えて、
>String.valueOfメソッドを使うのがいいんじゃないかなぁと。
私の勘違いで大変申し訳ありませんorz
Java1.5以降書き方が変わった部分が多いように感じるのですが、
1.4以前の書き方がやはり主流だと思うので、
エラーが起こらない場合でも気をつけるようにします。

>それと1〜3まで全部出来ると仮定すると
>1と2はキャストとは言わないんじゃないかな。
キャストと呼ばれるものは【3】のみ、という意識でした。
【1】【2】は普通の型変換ですよね?
(intとしては通りませんが、書き方としては…という意味で…)

>auto-boxingに過剰な期待をしている。
Autoboxingに頼ると
・勝手に型変換されてるから理解しにくくなる
・書いてないコードを追加する分パフォーマンスが落ちる
と思ってました…が、認識合ってますでしょうか;

>>私は
>>return "" + x;
>>だなー。
>自分も↑結構使ってるけど行儀の悪い書き方だと思ってた。
私もそう思ってました。
なんか見た目分かりにくいような感じがして…
動けば何でもいいじゃん!とも思うんですが^^;

評価

0

俺ならString#valueOf()だなあ。

>・書いてないコードを追加する分パフォーマンスが落ちる

JavaのAuto-Boxingは、シンタックスシュガーに過ぎんのじゃなかったっけ。
実行時のパフォーマンス低下はないのでは。

評価

0

ここまでInteger#toString(int) or (int,int)なし。
String#valueOf(int)は、内部的にはこっちに処理を委譲してるんだけどね。


パフォーマンス低下は、まず考えないでいい話。
特にInteger#intValue()だと単にreturnしてるだけだし、実行時の最適化で同じコードになっている可能性大。


auto-boxingの問題は、あらゆる場面でIntegerがintの代理になってくれると思ってしまいがちなとこだと思う。

例えば以下のようなのもね。

public class Foo {
    private Integer value = null;
    public void setValue(Integer value) { this.value = value; }
    public Integer getValue() { return value; }
}
Foo foo = new Foo();
if (foo.getValue() == 0) { // 実行時に落ちる
:

評価

0

auto-boxingについて勉強するいい機会になってます。

> シンタックスシュガー
これを嫌う人が(私の周囲に)多いので、今回の場合はString#valueOf()で書く方が適当・・・と思いました。

通りすがりのコメント(//)なんでさらっと流してください。

評価

0

私もとても勉強になってますm(__)m
ありがとうございます。

>auto-boxingの問題は、あらゆる場面でIntegerがintの代理になってくれると思ってしまいがちなとこだと思う。
$さん、例示して頂いてありがとうございます。
foo.getValue()がnullであるため、ぬるぽで落ちますよね。

ところで、Fooクラスで
public class Foo {
    private Integer value = 0;
  …
}
にすると落ちません。
foo.getValue()がInteger型を返すため、
「==で比較出来るのはプリミティブ型だけだから、比較出来なくて落ちてるのだろうなぁ」
と思っていたのですが…何か認識が違うようですorz
これもauto-boxingのせいでしょうか?
どなたかご教授願えませんか?

評価

0

>foo.getValue()がInteger型を返すため、
>「==で比較出来るのはプリミティブ型だけだから、比較出来なくて落ちてるのだろうなぁ」

getValue()の外部じゃなくて、内部で落ちてるのです。

評価

0

>getValue()の外部じゃなくて、内部で落ちてるのです。
うぅむ…こういうことでしょうか…?

【foo.getValue() == 0の行に来たとき】
(`・ω・)<"foo.getValue()"だ!fooのvalueをgetだぜ!
( ・ω・)<fooのvalueはnullなわけだな、ふむふむ…
( ・ω・)<おっ、"== 0"てことはintに変換せねばっ。
(´・ω・)<nullはintに出来ねぇよ…orz

ぬるぽ

評価

0

いや、getValue()の「外部」でいいと思うよ。
コード上見えないけど。

落ちる理由は、2010-12-02 11:21のとおり。
Integerをintに「変換」には若干違和感を覚えるけど、まあそれは細かい話。

たとえば#getValueAsLong()なんてメソッドは、ぱっと見てlongが返るかLongが返るか分からないよね。
前者なら(外部で)NullPointerExceptionになることはない。

評価

0

ああ、返り値はintじゃなかったのか。orz

評価

0

> .NETなら確か全部通るね。ただしtoString()ではなくToString()だけど。

ん?【3】は通らないでしょ。

【3】はJavaも通らないよね?
通るとしたら、Javaはどういう理屈で通るの?
(int → Integerがauto-boxingで解決でも、そこから(String)でキャストするには、コンパイラが内部的にtoStringの呼び出しに置き換えるのだろうか?)

評価

0

ああ、失礼。たしかに。

(3)はもともとJavaでも通らないしそれについては言及してないよ。

評価

0

> (3)はもともとJavaでも通らないしそれについては言及してないよ

通らないってことなら一安心。
【3】は通るというスレ主のコメントに
明確には誰も否定してないように読んだもんだから。
(もっかい読み直して否定されていることがわかった)

評価

0

ちょろちょろageて頂いてありがとうございます><

【3】が通らない件については、確かにちょっと分かりにくい書き方をしてました…申し訳ないです。
【1】return int.toString(); →通らない
【2】return String.valueOf(int); →通る
【3】return (String) int; →通らない
ですので、よろしくお願いします。

細かい話ではあるのですが
>Integerをintに「変換」には若干違和感を覚えるけど、まあそれは細かい話。
と(私も違和感を覚えながら)書いた件について、
より正確に説明するにはどう言えば良いのでしょう?
「Integer変数をもとにint変数を生成して」みたいなことになるでしょうか?

評価

0

オブジェクト指向においては、普通クラスの内部構造やメソッドの処理は考えないものだけど、IntegerやLongは「ラッパー」として作られてるものだからねえ。

Integer#intValue()は、finalフィールドへのgetter。
だから「生成」してるのとも違う。
フィールドを「取得」してるだけなんだけど、これをどう表現すればいいやら。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。