schwarzの雑記 このページをアンテナに追加 RSSフィード

07/10/25 (Thu)10月25日の雑記

[] 10月25日の雑記 - schwarzの雑記 を含むブックマーク

初のJavaネタ。


最近よく人からJavaの質問をされます。確かにRubyとC#の次にわかる言語ではありますが、そんなに組んだこともないので結構しどろもどろな回答しかあげられません。

さてそんな今日この頃ですが、こんな質問をされました。

「複数の値を返す関数ってどうやって作るの?」

かなり返答に詰まりました。慣れてる人ならなんでもないのかもしれませんが。


我らがRubyでは悩むことなくこれで終わりです。

def hoge
    return 1025, 3.14, "Hello world!"
end
i, d, s = hoge

C#でも、outがあるので困ることはありません。

class Test{
    static void hoge(out int i, out double d, out string s){
        i = 1025;
        d = 3.14;
        s = "Hello world!";
    }
    static void Main(string[] args){
        int i;
        double d;
        string s;
        hoge(out i, out d, out s);
    }
}

ではJavaではどうするか。まずはよしたほうが良さそうなのを二つ。

class Test{
    static int out_i;
    static double out_d;
    static String out_s;
    static void hoge(){
        out_i = 1025;
        out_d = 3.14;
        out_s = "Hello world!";
    }
    static void main(String[] args){
        hoge();
        System.out.println(out_i);
    }
}
class Test{
    static Object[] hoge(){
        return new Object[]{1025, 3.14, "Hello world!"};
    }
    static void main(String[] args){
        Object[] results = hoge();
        int i = ((Integer)results[0]).intValue();
    }
}

今のJavaはintをObjectにするときは new Integer(1025); とかしなくて良くなったので若干楽にはなりましたが、当然ながら出すときの手間は変わらず。



おそらく無難なのはクラスで返す方法。

class HogeResult{
    public int i;
    public double d;
    public String s;
    public HogeResult(int i, double d, String s){
        this.i = i;
        this.d = d;
        this.s = s;
    }
}
class Test{
    static HogeResult hoge(){
        return new HogeResult(1025, 3.14, "Hello world!");
    }
    static void main(String[] args){
        HogeResult result = hoge();
        int i = result.i;
    }
}

どうせならコンストラクタにhoge()の内容を入れてしまうと楽ですね。というわけで今の自分での最良の回答はこちら。

class Hoge{
    public int i;
    public double d;
    public String s;
    public Hoge(){
        this.i = 1025;
        this.d = 3.14;
        this.s = "Hello world!";
    }
}
class Test{
    static void main(String[] args){
        Hoge hoge = new Hoge();
        int i = hoge.i;
    }
}

他にいい方法があったら教えてください。

yf30yf302007/10/27 23:44関数ってかメソッド?
複数の値を返さなければならない時点で、きっと何か見直した方が良い感じがしますね~

後は、HogeResult見たいな方法の方が多いと思う。
コンストラクタよりかsetter/getterで、デフォルトコンストラクタのみ用意かな~?

SchwarzSchwarz2007/10/29 21:13確かに、今見直すとHogeResultの方がよさそうですね・・。