• ベストアンサー

return new使用時

kztkの回答

  • ベストアンサー
  • kztk
  • ベストアンサー率53% (59/110)
回答No.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で設定されたフィールドごと、あとで再使用する >可能性があったら、 「フィールド」の意味が分かっていないように思われます。

kannitiha
質問者

補足

回答ありがとうございます。 回答を読んで、重複してますが、自分なりに解読してみました。 クラス型か、どうかは、 たとえば、 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.フィールド;は、ユーザー情報クラスが持つ、データを参照するという理解でいいのでしょうか? この場合、フィールドはクラスが持つデータとして理解しています。 宜しくお願いします。

関連するQ&A

  • 実行時に確定するメソッドを呼び出す方法について

    invoke()メソッドや、Methodクラスを 使用するなど。以前に小耳にはさんだ。記憶があります。 以下の3つの引数から 動的に該当メソッドを呼び出す。 処理を実装コードがすぐだせる方がいると 助かります。 Object foo(Object obj, String methodName, Collection param) (1)該当オブジェクト getClass()などで、該当クラスを動的に  特定。 (2)、(1)が保有しているメソッドのうち、 発行したいメソッドの名前 (3) parmには1要素ごとに2要素のObject[]型を   を格納して、 Object[0]の要素にかんしてはが引数の型についての完全修飾クラス名をあらわすString型。   Object[1]については実際に入っている値。 上記3つの引数をうけとって内部で getClass()とかつかって 必要な情報はすべて実行時に動的に 取得して objの該当オブジェクトを 発行し、foo()メソッド自体の 返却値はそのメソッドの返却値とする という ロジックの実装のサンプルがあると。 とても、うれしいです。 じゃ、void型が返却の時どうすんねん。 とか、staticの時どうすんねん。 とか、その変のアイデア持ってる 人がいるととてもうれしい。 以上

    • ベストアンサー
    • Java
  • virtual時のoverrideとnewの違い

    C#で、 virtualがない時はnewしか使えませんが、 virtualがある時はoverrideとnewが使えますが、 overrideとnewを使った時の違いがよく分かりません。 例えば、基本クラスに public virtual void show(){  Console.WriteLine("基本クラス"); } というメソッドがあるとして、 派生クラスで、 public override void show(){  Console.WriteLine("派生クラス"); } とすると、 基本クラスのメソッドが上書きされて、 Console.WriteLine("派生クラス"); が実行されますが、 派生クラスで、 public new void show(){  Console.WriteLine("派生クラス"); } とした場合にも、 基本クラスのメソッドが隠匿されて、 Console.WriteLine("派生クラス"); だけが実行されます。 virtual使用時において、 継承メソッドの隠匿(new)と、 継承メソッドの上書き(override)では、 一見、なにも違いがないように見えるのですが、 何か違うのでしょうか。

  • Ruby 特異メソッドのnewが先に実行?

    Rubyのインスタンス生成について質問があります。 通常クラスを定義する場合は class Hoge ; def hello(); pirnt "hello"; end であると思います。 ただ Hoge = Class.new(); でもクラスは定義できるとききました。 ただこの場合Hogeクラスに定義できるのは HogeというClassクラスから作られた特異クラスとしてのHogeに 特異メソッドのみを定義できるということですよね? 通常のインスタンスメソッドは定義できませんよね? ではでは、 hoge = Class.new(); とした場合はどうなるのでしょうか? この場合は Classクラスの純粋なインスタンスとなるのでしょうか? 前者の定義とおなじ仕方ですが代入先が、通常の変数です。 この場合は、クラスオブジェクトとして生成されるのですか? オンラインマニュアルをみたところ 「新しく名前の付いていない superclass のサブクラスを生成します。 superclass が省略された時にはObject のサブクラスを生成します。 名前のないクラスは、最初に名前を求める際に代入されている定数名を検索し、見つかった定数名をクラス名とします。」 とあります。 上記内容は Classクラスの特異クラスとして定義されている特異メソッド(new)です。 これは Class.new()で作られたインスタンスを代入する先が定数であればその定数名と同じクラスを定義しつつそのClassクラスのクラスオブジェクトを生成するという意味合いでまちがいないでしょうか? 上記のとおりであれば hoge =Class.new()の場合は、やはりhogeというクラスを定義することになるのでしょうか? クラス定義は定数でなければならないはずですよね。 ただ実際、 p hoge;として出力すると#とひょうじされています。これはhogeがクラスオブジェクトではなく ただのインスタンスであるということでしょうか? であるならばこの hoge = Class.new()の式のnewはClassクラスオブジェクトに定義された特異メソッドではなく Classクラスに定義されたnewメソッド・・・・・つまりClassクラスに定義されたインスタンスメソッドの方のnewメソッドだとおもうのですが・・・・・・。 つまりこちらのメソッドですね。 「new( ... ) クラスのインスタンスを生成して返します。このメソッドの引数はブロック引数も含め initialize に渡されます。」 ※オンラインリファレンスから参照しました。 しかし 通常メソッドの検索は特異メソッドからはじまりその後クラスのインスタンスメソッド->親クラスのメソッドと 検索して行くとあります。 必ず先に、特異メソッドを実行しているはずだと思うのですが・・・。 やはり特異メソッドnewを実行しているのでしょうか? 長々すみませんが、ご教授ください。

    • ベストアンサー
    • Ruby
  • Strategyパターンを用いた実装について

    Strategyパターンを用いた実装について 現在Javaを勉強しており、 Strategyパターンを用いた以下の実装を考えています。 public class UseStrategy { private Strategy strategy; public void doSomthing(int num) { switch (num) { case 0: strategy = new AlphaStrategy(); break; case 1: strategy = new BetaStrategy(); break; case 2: strategy = new GammaStrategy(); break; } // 変数strategyを用いて処理を続行していく // ... } private interface Strategy { public abstract void method_1(); public abstract void method_2(); } private class AlphaStrategy implements Strategy { @Override public void method_1() { //do something } @Override public void method_2() { //do something } } private class BetaStrategy implements Strategy { @Override public void method_1() { //do something } @Override public void method_2() { //do something } } private class GammaStrategy implements Strategy { @Override public void method_1() { //do something } @Override public void method_2() { //do something } } } つきましては、以下ご質問させてください。 (1)Strategyパターンの実装において、  上記UseStrayegyクラスのように、あるクラスの入れ子クラスとして  Strategyインターフェース及び、その実装クラスを実装する方法は  普通でしょうか?    それとも、入れ子クラスとしてではなく、Strategyインターフェース、  その実装クラスを全て 別クラスファイルに分けた方が良いのでしょうか? (2)例として、  BetaStrategy.method_2()とGammaStrategy.method_2()の処理が全く  同じだったとします。その場合、共通となる処理を一つのメソッド化し、  そのメソッドをBetaStrategy.method_2()とGammaStrategy.method_2()から  コールしたいと考えております。  その際、共通となる処理メソッドの実装箇所としては、以下のいずれが良いのでしょうか。   (A)Strategyインターフェースを抽象クラス化し、二つの共通処理メソッドを実装する。  (B)UseStrategyクラスに、共通処理を実装する。    それとも、上記の様なケースがある場合Strategyパターンは不適切でしょうか。 文面に分かりづらい面や、Javaのオブジェクト指向・デザインパターンについて 理解の乏しいところがあるかと思いますが、ご回答の程よろしくお願いいたします。

    • ベストアンサー
    • Java
  • return文でもメソッドが止まらない?

    いつもお世話になっております。 深さ優先探索をスタックを使わずにJavaで実装したメソッドを書いたのですが なぜかメソッドを終わらせるreturn文まで到達しているようなのに (return直前にメッセージを表示させて到達していることを確認しました) それ以降も動き続けしかも挙動がめちゃくちゃになるという現象に悩まされています。 (かなり長くなってしまっているので実際のプログラムを記載するのは止めます) returnしたら必ずメソッドは処理を終えるものではないのでしょうか? 思い当たることとしたら、再帰呼び出しを使っているので一つメソッドの処理を終わらせても それを呼び出した側にまた処理が戻っているのかも?ぐらいとしか検討がつきません。 せめてreturnが機能しないことに再帰呼び出しが関係あるのかないのかを知りたいです。 完全にお手上げ状態なのでなにか対処法を知っている方、ぜひともよろしくお願いします。

    • ベストアンサー
    • Java
  • JavaScriptのreturnについて

    <script language="JavaScript"> <!-- function SymError() { return true; } window.onerror = SymError; var SymRealWinOpen = window.open; function SymWinOpen(url, name, attributes) { return (new Object()); } window.open = SymWinOpen; //--> </script> このスクリプトのSymErrorという関数で return trueと書いてありますがこれはなんでしょうか? 返り値だったら()がつくはずですしそもそもこの関数には引数がないです。 それとwindow.openには()がつかないのでしょうか?(windows.open()のように) 次のSymWinopenという関数の返り値にnew Object()がありますがこれもなんでしょうか? 新しいオブジェクトというのはわかるのですが実際何をしてるのかわからなくて。 最後にwindow.open = SymWinOpenこれはSymWinOpenという名のウィンドウを 開くということでしょうか?でもopenメソッドは○=window.open()という形を 取るはずなのに逆なのが疑問です。 たくさん質問をして恐縮ですがわかるのだけでいいですのでご教授していただけたらうれしいです。 ちなみにここのHPのソースです。 http://www.oscarcreation.com/japanese/

  • javascript new演算子について質問があります。

    javascript new演算子について質問があります。 只今javascript勉強中なのですが、どこかのサイトでnew演算子は悪いパーツとの 記事を読みました。 そこでnew演算子を使用せずにオブジェクト生成の方法を試行錯誤考えてみたのですが (IE用に__proto__もなしで)例えば以下コードはアリなコードでしょうか?? あるいはありえない感じでしょうか?? またnewが悪なのはインスタンスを作る時にnewを付け忘れると、 グローバルな汚染をしてしまうということだけなのでしょうか?? オブジェクトとプロトタイプの理解に苦しんでいるところなので 色々と曖昧なのですが、どなたかどうぞご教授お願い致します。 var obj = {}; obj.method = function(){ this.prop1 = "hoge" return this; }; obj.method.prototype = obj.method(); obj.method.prototype.prop2 = "fuga"; var obj2 = obj.method(); console.log(obj2)

  • 書籍 メタプログラミングRubyの中の一文

    上記書籍のP143の カレントクラスについて質問です。 上記書籍に、 【クラス定義のなかでは、カレントオブジェクトselfは定義されたクラスである】 という記述がありますが 例えば、以下のようなクラス定義あがあるとします。 class Test print self.class def self.method_01() print "メソッド01" end def method_02() return self end end クラス定義内に3箇所selfが存在しますが、 インスタンスメソッド の method_02()内のselfはnewメソッドによって 作成されたTestクラスのインスタンスの意味だと思います。 それより上の二つのselfは確かに定義中のカレントオブジェクト・・つまりTestクラス ですけれど、なぜ書籍では、クラス定義内でのselfという表現なのでしょうか? 個人的には、【クラス定義内で定義されるインスタンスメソッド内にあるselfを除くselfはカレントオブジェクトである】という風に、説明すべきだと思うのですが 何か私の解釈に誤りがあるのでしょうか?それとも、文面を気にしすぎなだけでしょうか? くだらない質問ですがご意見をおきかせください。

    • ベストアンサー
    • Ruby
  • return;

    retrun;を取ると動作がおかしくなるんですが return;にはどういう働きがあるんでしょうか? お願いします。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; //<applet code = "a.class" width = "300" height = "300"></applet> public class a extends Applet implements ActionListener{ Dialog d; Frame f; public void init() { setLayout( new GridLayout( 1, 1 ) ); Button b = ( Button )add( new Button( "frame" ) ); b.addActionListener( this ); } public void actionPerformed( ActionEvent e ){ if( e.getActionCommand() == "frame" ){ if ( f == null ){ f = new Frame( "Kitty on your lap" ); Button fb = (Button)f.add( new Button( "Kitty " ) ); fb.addActionListener( this ); f.setSize( 200 , 200 ); f.setVisible( true ); }else if( d == null ){ f.dispose(); f = null; } return; } if( e.getActionCommand() == "OK" ) { d.dispose(); d = null; return; } d = new Dialog( f, "Kitty", true ); d.setLayout( new GridLayout( 2, 1 ) ); d.setResizable( false ); d.add( new Label( "Kitty on your lap" ) ); Button b = (Button)d.add( new Button( "OK" ) ); b.addActionListener( this ); d.setSize( 400 , 200 ); d.setVisible( true ); } }

    • ベストアンサー
    • Java
  • newしないインスタンス?実体化しなくてもいいの?

    JAVAについて教えて下さい。 ServletContext application = getServletContext(); の成り立ちの意味なのですが、newがなぜないのか教えて下さい。 ~自身の考え~ (1)サーブレットコンテキストというクラスをインスタンス化して (サーブレットコンテキスト 変数A = new サーブレットコンテキスト();)     ↑                         ↑   クラス                       クラス (2)変数Aドットメソッド()によって、代入変数Bを作り上げる (サーブレットコンテキスト 代入変数B = 変数A . メソッド();) (3)のはずが、上記の式にはnewがありません。 なんで?? ~~ ~疑問点~ もしかしたらHttpServletでimportしているからそこでnewインスタンス化宣言している? だとするならどのような式になっているのでしょうか。 もしくはメソッドのF3キーとして上位をたどったときに出てきた public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { public ServletContext getServletContext() { return getServletConfig().getServletContext(); } } として抽象クラスが出てきましたが、どこにもnew実体化していません。 よろしくお願いいたします。

    • ベストアンサー
    • Java