- ベストアンサー
return new使用時
いつもお世話になっています。 return返却時に、newインスタンスを使用する場合、 newクラス名()、newクラス名().メソッド名()での返却が可能だと思うのですが、このような場合の実装方法はどうなるのでしょうか? 考えているのは、実装すると、 (1)、return new クラス名().メソッド名()で行う場合 public クラス名 method1() { return クラス名; //実現できない return このクラスに存在するメソッド名(); //OK return null; //OK } といった形になり、クラス名()が実装できない (2)、return new クラス名()で行う場合 public クラス名 method2() { return クラス名; //OK return null; //OK } となり、 (1)で返却された場合、返却されたメソッドの機能を持つことができると同時に、クラス自体の機能も持つ(この場合、クラスオブジェクトは持てず単にそのメソッドのみ使用可だと思っていたのですが...) (2)で返却された場合、返却されたクラスオブジェクトを持つことができる といった感じになります。 実際に、試したところ(1)と(2)でさほど変化がありません。 言いたいことは、 return時に、クラス名()で返却された場合、とクラス名().メソッド名()で返却された場合の違いと、 実際に使用されるのはどういったときかを教えて頂きたいのですが。 また、メソッドがつくのとつかない場合の違いはあったりするのでしょうか? 説明が不十分で申し訳ありません。 宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
■まず大前提として、return new ClassName().methodName();という書き方は何か特殊な書き方であると誤解されていますか?例えば下記のコードですが、 >/** 戻り値は、String型(クラス)なので、その戻り値のメソッドを返せる **/ >public static String returnTest() { > return new returnSample_S().getKey(); >} これはつまり、下のように書くことと全く同じわけですが、 public static String returnTest() { returnSample_S r = new returnSample_S(); String s = r.getKey(); return s; } それはよいですか? ■次に、ここでrを返すのかsを返すのかに関しては、「このメソッドで提供すべき機能は何なのか」、「どういうメソッドをつくならければならないのか」という要件によっておのずと決まりませんか? 例えば、以下のようなメソッドがあったとしましょうか。 /**日付型の変数を"yy/MM/dd"という形式の文字列に変換して返す*/ public String formatDate(Date d){ return new SimpleDateFormat("yy/MM/dd").format(d); } ここでSimpleDateFormatのインスタンスを返すのか、フォーマットされた後の文字列を返すべきなのか、悩みますか?SimpleDateFomatを返されても困りますよね?違いとかそういう次元の話ではないと思うのですが。 ■あと、随所に気になる表現があります。これも質問者様の質問内容を分かりにくくしている一因ですので、一度よく調べて直されたほうがよいかと。 >戻り値は、String型(クラス)なので、その戻り値のメソッドを返せる 「メソッドを返す」という意味が分かりません。 return new returnSample_S().getKey(); は、新しいreturnSample_Sインスタンスを生成したあと、そのgetKey()メソッドの戻り値を返しているのであって、getKey()メソッドを返しているのではありません。 >//クラスインスタンスを実行して、keyを取り出す 「クラスインスタンスを実行する」という意味が分かりません。インスタンスは実行するようなものではありません。 >たとえば、returnで設定されたフィールドごと、あとで再使用する >可能性があったら、 「フィールド」の意味が分かっていないように思われます。
その他の回答 (2)
- kztk
- ベストアンサー率53% (59/110)
>return時に、クラス名()で返却された場合、とクラス名().メソッド名()で返却された場合の違い 例えば、 ■return new クラス名() public String methodA(){ return new String("aaa"); } ■return new クラス名().メソッド名() public String methodB(){ return new String("aaa").substring(0,1); } これは、異なるものを返却する、異なる2つの処理であり、「返却の仕方」が違うとかそういう話ではありません。 >メソッドがつくのとつかない場合の違い 何もかもが違います。比較するようなものではありません。 >実際に、試したところ(1)と(2)でさほど変化がありません。 とのことなので、そのコードを提示していただいた方がよろしいかと。 提示された擬似コードからでは、質問者様が何がしたいのか推測できません。
補足
回答ありがとうございます。 return の使用法を解説を読んで再度作成してみました。 使用法としては以下のような感じでいいのでしょうか? public class returnSample { /** 戻り値は、クラス型指定なので、インスタンスを生成して返す **/ public static returnSample_S returnSample() { return new returnSample_S(); } /** 戻り値は、String型(クラス)なので、その戻り値のメソッドを返せる **/ public static String returnTest() { return new returnSample_S().getKey(); } public static void main(String[] args) { //keyの値プラスその値が存在するクラスインスタンス毎取得する returnSample_S test = returnSample(); //クラスインスタンスを実行して、keyを取り出す System.out.println(test.getKey()); /** メソッド名で返却する **/ // この場合の目的:keyの値だけを取得する System.out.println(returnTest()); } } public class returnSample_S { String key = ""; /** キーワード **/ /** コンストラクタ **/ public returnSample_S(String key) { this.key = key; } public String getKey() { if(key == "a") { this.key = "A"; } else { this.key = "n"; } return "入力値は、"+this.key+"です。"; } public returnSample_S test() { /** エラー 原因、戻り値がreturnSample_Sクラス型なのに対し、メソッドがString型だから **/ return new returnSample_S("a").getKey(); /** 正しい返却値 **/ return returnSample_S("a"); } } >メソッドがつくのとつかない場合の違い これは、クラスオブジェクトを取得するか、結果のみを取得するか、というわけではないのでしょうか? たとえば、returnで設定されたフィールドごと、あとで再使用する可能性があったら、クラス型で取得しておかないと 結果は保持できない。etc... >実際に、試したところ(1)と(2)でさほど変化がありません。 思ったわけとして、クラス型で返しても、メソッドで返しても最終的には、メソッドの結果が取得できるので変化がないと思ってしまいました。 宜しくお願いします。
- pcbeginner
- ベストアンサー率46% (261/560)
違いも何もないでしょ。 return new HogeClass() だったら、HogeClassのインスタンスを返すんだし、 return new HogeClass().hogeMethod() だったら、HogeClassのインスタンスを生成してからhogeMethodを実行して、そのhogeMethodの戻り値を返すんだから。 (↑hogeMethodの戻り値はHogeClassのインスタンスであることが前提。そうじゃなければコンパイルエラー) returnするときにはreturnすべきものをreturnする。 それが新しく生成したインスタンスだろうと、どこぞのメソッドの戻り値だろうと、メソッドで宣言している戻り値と同じならOK。違ったらコンパイルエラー。 intを返すメソッドで考えてみたら? intならnewとかくラス名().メソッド名()とか関係なくなるでしょ?
補足
回答ありがとうございます。 >return new HogeClass()だったら、HogeClassのインスタンスを返すんだし、 >return new HogeClass().hogeMethod()だったら、HogeClassのインスタンスを生成してからhogeMethodを実行して、そのhogeMethodの戻り値を返すんだから。 この部分ちょっと勘違いしていました。 >intを返すメソッドで考えてみたら? intならnewとかくラス名().メソッド名()とか関係なくなるでしょ? その通りでした。 また、String型だと、charAt()とかのメソッドが存在するから String.valueOf(1)とかの実行が可能になるけど、int型だとそんなものが存在しないので、実際は return int型になる、という事なのでしょうか? また、サンプルを回答番号:No.2に補足したので、できたら修正点等を指摘頂けないでしょうか? 宜しくお願いします。
補足
回答ありがとうございます。 回答を読んで、重複してますが、自分なりに解読してみました。 クラス型か、どうかは、 たとえば、 public class Test { public String search_S() { return new User().getUserName(); } } public class User { private String address; private String addressNumber; public void setUserName() { this.userName = userName; } public String getUserName() { this.userName = userName; } public String getAddress() { return address; } public String getAddressNumber() { return addressNumber; } } というクラスがあったとして、 return 時は、どういった結果を求めているのかで変わってくる。 >>//クラスインスタンスを実行して、keyを取り出す >「クラスインスタンスを実行する」という意味が分かりません。インスタンスは実行するようなものではありません。 インスタンスは、 まずインスタンスを生成する前のクラスは、単なる「設計図」であり、このままではクラスの機能を使うことができない。 なので、クラスの機能を使えるようにするため、クラス名 変数 = new クラス名()でインスタンスを生成し、クラスの機能がようやく使用可能となる。 return new User().getUserName()にするのは、クラスオブジェクトが持つユーザー名だけがほしい return new User(); クラスオブジェクトの取得 Userクラスが持つデータがほしい >>「メソッドを返す」という意味が分かりません。 >return new returnSample_S().getKey(); >は、新しいreturnSample_Sインスタンスを生成したあと、そのgetKey >()メソッドの戻り値を返しているのであって、getKey()メソッドを返 >しているのではありません。 つまり、これは、getKey()というメソッドでkey値を返すという操作であり、返す返さないの問題でない。 ex)setUser()メソッドでユーザー名を設定するし、(操作)、getAddress()メソッドで住所を取得する(操作)。 この時に最終的に取得されるのが住所(フィールド) その際に、http://jibun.atmarkit.co.jp/lskill01/rensai/imajava02/imajava01.htmlの説明を読んだのですが、 大体このように理解しておけばいいということでしょうか? >>たとえば、returnで設定されたフィールドごと、あとで再使用する >>可能性があったら、 >「フィールド」の意味が分かっていないように思われます。 フィールドは、メソッド外で宣言される変数である。 ex)名前を登録する → その名前の住所、郵便番号を返す(戻り値)の場合 フィールド = 住所、郵便番号で、 また、フィールドの宣言理由が、メソッド=操作なので、操作結果を取るにはデータが存在しないといけないから public class User { private String addressNumber = "1565-2222"; //郵便番号 private String address = "○×市"; //住所 //以下、略 } といった感じでしょうか? つまり、private String addressNumber,address のことがフィールドで、 return時には、どういう結果を求めているかで、決められるので フィールドはひとまず考えない。 操作(メソッド)が決まれば、戻り値はすでに規定されているので自然とわかると思えるのですが。 一般的に、フィールドは、セッター・ゲッターで取り出すもので、 直接、クラスにアクセスして、データ(フィールド)を参照することは少ない User user = new User(); user.フィールド;は、ユーザー情報クラスが持つ、データを参照するという理解でいいのでしょうか? この場合、フィールドはクラスが持つデータとして理解しています。 宜しくお願いします。