• ベストアンサー

インタフェースをnew?

あるコードを読んでいて、 private Connection connection = null; final InputStream fin = in; connection = new Connection(){ public InputStream getInputStream(){ return fin; } }; というコードがあったのですが、意味が分かりません。 Connectionというのは、インタフェースですよね。なぜ、インタフェースにnewしてインスタンス化?しているのでしょうか?また、なぜ{}に;がついているのでしょうか?

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

  • ベストアンサー
noname#94983
noname#94983
回答No.1

これは「無名クラス(匿名クラス)」というもの。要するに、Connectionクラスではなく、名前はないが、Connectionを継承(implements)した「何か」のインスタンスを作っている。 new Connection()の後に{}があって、そこにメソッドの定義などが書かれているが、これは実行されたとき、これらのメソッドを実装した形でオブジェクトが作成される。ということは、これはConnectionクラスのインスタンスではない、ということになる(Connectionにないメソッドがあったり、Connectionのメソッドがオーバーライドされていて、Connectionとは明らかに異なるから)。といって、これには明確な名前の付けられたクラス定義も存在しない。 これは、その場でオンデマンドに新しいクラスが生成され、そのインスタンスが作られている、と想像すればいいだろう。したがって、Connectionではないのでnewしてインスタンスを作ることができる。わざわざクラスを定義するのは面倒くさい、一時的にインスタンスを作って利用できればいいや、というようなときに使われる。「無名クラス」で検索すれば、いろいろと情報が出てくるだろう。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • インターフェースは New 出来ない! の?

    現在 JDKSE 1.3.1 で Java の調査をしています。 Event 関連の調査中に疑問に感じた事が有ります。 下記の件に関し、意見有りましたらよろしくお願い致します。 まずJava 言語の仕様で、「インターフェースはインスタンスを作成できない。」 と有ります。 これはあるサンプルコードからの抜粋です。 内容は、Applet にコマンドボタンコントロールを追加し、クリックされた際の処理を登録しているんですが・・・・・ button.addActionListener(new ActionListener(){..... となっています。 コンパイル成功し、正常に記述されたイベント処理が行われています。 が、addActionListener の引数で渡されている ActionListener はインターフェースですよね? あれっ、違うのかな・・・・ なぜ、new ActionListener()... として引数に渡せるのでしょうか? 現在自身で勉強中なのですが、平行して質問させて頂きました。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • singletonによるインターフェイスの実装

    Java勉強中の初心者です。 標題の件についてお願いします。 以下、簡単に条件を説明させていただきます。 Aクラス = メインクラス Bクラス = インターフェイスクラス Cクラス = DとEを動的に生成するクラス Dクラス = インターフェイスを実装するクラス Eクラス = インターフェイスを実装するクラス AクラスにB.getInstance(name)があります。 for文の無限ループがあります。 Cクラス class C { public static B getInstance(String name) { // Aクラスのaと変数nameが比較して一致したら // Dクラスのインスタンス生成 // 一致しなかったらEクラスのインスタンス生成 if(A.a.equals(name)){ return D.getInstance(); }else{ return E.getInstance(); } } } Dクラス class D implements B{ private D() { } public static D getInstance() { D d = new D(); return d; } // インターフェイスでのメソッド省略します。 } Eクラス class E implements B{ private E() { } public static E getInstance() { E e = new E(); return e; } // インターフェイスでのメソッド省略します。 } この条件の時にnewするたびにインスタンスが 生成されてしまいます。 インスタンスの生成が一度だけしか 生成されないようにするには、C,D,Eクラスで どのように記述すればいいか悩んでいます。 (骨組みは書けましたが) クラスを簡単に省略してわかりづらいと 思いますがよろしくお願いします。

    • ベストアンサー
    • Java
  • ファイルの書き出し方法について

    お世話になります。 ファイルの出力方法についての質問です。 inputstreamからファイルを作成するとき、もっとも高速に行うにはどのようにすればいいのでしょうか? とりあえず私は // URLクラスのインスタンスを生成 URL myURL = new URL("欲しいページ"); // 接続します URLConnection con = myURL.openConnection(); // 入力ストリームを取得 BufferedReader in = new BufferedReader( new InputStreamReader( con.getInputStream())); String tmp = ""; String str = ""; while((str=in.readLine())!=null){ tmp = tmp + str; } //その後strをファイルに書き出す。 という風にやっておりますが、もっと高速にする方法はないでしょうか? 私なりのイメージではstreamからstreamへ直接渡せないのかな?という ことができないのかなという疑問です。 (いちいちStringになおさなければいけないのかな?ということです。) 以上です。

    • ベストアンサー
    • Java
  • DB接続について

    JAVA初心者です。 DB接続についてなのですが、いままで設定ファイルより<url>,<user>,<password>等の情報を取得してDB接続していたのですが、今後、『WebSphere』のデータソースの設定から取得する方式に変更となり、プログラム例として次のコードをもらったのですが… InitialContext ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("登録したJNDI名"); Connection conn = ds.getConnection(); これを以下のコードにどう組み込んでよいかわかりません… どうかご教授お願いします。 public class ConnectionCache{ private static final string This_Name = "jp.co.ise.filetransfer.server.common.ConnectionCache"; private static ConnectionCache instance = null; private static ObjectPool pool = null; private DataSource ds = null; // java.lang.Object#Object() private ConnectionCache(){} // Method ConnectionCache // @param ds private ConnectionCache(DataSource ds){ this.ds = ds; } // Method getDataSource // @return DataSource public static DataSource getDataSource(){ return instance.ds; } public static void init(Properties prop) throws Exception { try { class.formName(prop.getProperty("drive")); // プールするアイドルコネクション数の上限 int maxIdleNum = Integer.parselnt(prop.getProperty("maxIdle")); // プール初期化時のアイドルコネクション数 int initIdleCapacityNum = Integer.parselnt(prop.getProperty("initIdleCapacity")); // ObjectPoolインスタンスを生成 int initIdleCapacityNum = Integer.parselnt(prop.getProperty("initIdleCapacity")); // Connectionオブジェクトを生成するためのConnectionFactoryインスタンスの生成 ConnectionFactory conFactory = new DriverManagerConnectionFactory( prop.getProperty("url"), prop.getProperty("user"), prop.getProperty("password") ); // PoolableConnectionFactoryインスタンスの生成 new PoolableConnectionFactory( conFactory, pool, null, prop.getProperty("validationQuery"), true, true ); // プーリング機能を持つDataSourceインスタンスの生成 DataSource ds = new PoolingDataSource(pool); // 初期サイズ指定分のコネクションをプール ArrayList initConnections = new ArrayList(); // 新規接続 for(int i = 0; i < initIdleCapacityNum; i++){ initConnections.add(ds.getConnection()); } // プールへ返却 for(int i = 0; i < initIdleCapacityNum; i++){ ((Connection)initConnections.get(i)).close(); } instance = new AppleConnectionCache(ds); system.out.println( THIS_NAME + "DB接続プールを初期化しました。:プール内のコネクション数 = " + pool.getNumIdle()); } catch (Throwable t) { throw new Exception ( THIS_NAME + "DB接続プールの初期化に失敗しました。:" + t.getMessage()); } } //Method getInstance. //@return AppleConnectionCache public static synchronized AppleConnectionCache getInstance() { return instance; } //Method getConnection. //@return Connection public synchronized Connection getConnection() throws Exception { Connection conn = null; try{ conn = ds.getConnection(); } catch (SQLException e) { throw new Exception ( THIS_NAME + "DB接続に失敗しました。:" + e.getMessage()); } return conn; } //Method closeCache. public synchronized void closeCache() { try{ pool.close(); system.out.println(THIS_NAME + "DB接続プールのリソースを開放しました。"); } catch (Exception e) { } }

  • privateスコープについて

    はじめまして。Javaの初心者です。 どうしてもわからないことがあります。 以下のコードを見てみてください。 ************************************************ final class Foo { private int a; Foo(int a) { this.a = a; } public int func(Foo f) { if(this.a <= f.a) { return 1; } else { return -1; } } } final class Demo01 { public static void main(String[] args) { Foo obj1 = new Foo(10); Foo obj2 = new Foo(20); System.out.println(obj1.func(obj2)); } } ************************************************ Fooクラスの2つの異なるインスタンスのフィールドの 値の比較は、funcメソッドの呼び出しによって行われるのですが、funcメソッドの中で、実行中のインスタ ンス(this)のaにアクセス(this.a)することができるこ とは理解できるのですが、実行中のインスタンスとは 異なるFooクラスのインスタンスのaにアクセス(f.a)し たときprivateアクセスのため、参照できないとはなら ないのは、なぜなのでしょうか?どうかご教授をお願 いします。

    • ベストアンサー
    • Java
  • シングルトン内で使用したオブジェクトのGC

    基本的な質問で恐縮ですがGCについて教えてください。 例えば、シングルトンインスタンス内のhogemethodメソッドにてHashMapのインスタンスを 生成・使用した場合(以下の質問に続く)、 【質問】 hogemethodメソッドが終わればHashMapのインスタンスはスコープを外れるので、hogeMap = null;などしなくてもGC対象となり、そのうちGCされるのでしょうか?いやいや、hogeMap = null; することによりGC対象となり、そのうちGCされるのでしょうか?それとも、nullセットしようがしまいが、シングルトンのインスタンスが存在し続ける限りGC対象とはなってもGCされることは無いのでしょうか? package hoge; public class MySingleton {  private static MySingleton instance = new MySingleton();  private MySingleton() {}  public static MySingleton getInstance() {   return instance;  }  public void hogemethod() {   HashMap hogeMap = new HashMap();   hogeMap .put("りんご", "apple");   hogeMap .put("ぶどう", "grapes");     :   hogeMap = null; ←★hogeMap をGC対象にするためにはnull代入は必要なのか?  } } よろしくお願いします。

    • ベストアンサー
    • Java
  • 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時に、クラス名()で返却された場合、とクラス名().メソッド名()で返却された場合の違いと、 実際に使用されるのはどういったときかを教えて頂きたいのですが。 また、メソッドがつくのとつかない場合の違いはあったりするのでしょうか? 説明が不十分で申し訳ありません。 宜しくお願いします。

    • ベストアンサー
    • Java
  • C# インターフェイスの実装

    インターフェイスの実装でエラーが出て困っています。 「'(略).SeatCondition' はインターフェイスメンバ '(略)ICondtion.Judge(略)を実装しません。」 とエラー表示されます。 //条件判定クラスのInterface public interface ICondtion { bool Judge(RsvReservEmptySearchPerson.ReserveData aReserve); } //曜日判定のクラス public class DayOfWeekCondition : ICondtion // こちらはエラーがでない { private DayOfWeek mExpectedDayOfWeek; public DayOfWeekCondition(DayOfWeek aDayOfWeek) { mExpectedDayOfWeek = aDayOfWeek; } public bool Judge(RsvReservEmptySearchPerson.ReserveData aReserve) { if (aReserve.Date.DayOfWeek == mExpectedDayOfWeek) { return true; } return false; } } //ユニット判定のクラス public class SeatCondition : ICondtion // ここにエラーが出る。 { private string mExpectedSeatId; public SeatCondition(string aSeatId) { mExpectedSeatId = aSeatId; } public bool Judge(RsvReservEmptySearchPerson.ReserveData aReserve) { foreach (RsvSeatData tSeat in aReserve.Seats) { if (tSeat.Id == mExpectedSeatId) { return true; } } return false; } } どこがおかしいのかわかりません。 ご教示お願いします。

  • ボーダー上か否かの判定について

    いつもお世話になってます。 またお願いします。 画面上にパネルを配置して パネルに外枠を設定します。 その内部にボタンを2つ配置しました。 この設定した外枠をドラッグ&ドロップすることで パネル(外枠)のサイズを変更し、 外枠以外のパネル部分をドラッグ&ドロップすることで ボタンや外枠含むを含むパネル全体の移動を行いたいのです。 ★のところで枠上か否かを判定させれば良いのでしょうか? それとも他に方法がありますでしょうか? 宜しくお願いいたします。 public class SampleButtonSize extends JFrame { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private JPanel jPanel = null; private JButton jButton = null; private JButton jButton1 = null; public Point pMus; private JPanel getJPanel() { if (jPanel == null) { jPanel = new JPanel(); jPanel.setLayout(null); jPanel.setBounds(new Rectangle(30, 25, 205, 98)); jPanel.setBorder(new TitledBorder( new EtchedBorder(), "Power" )); jPanel.add(getJButton(), null); jPanel.add(getJButton1(), null); jPanel.addMouseMotionListener(new java.awt.event.MouseMotionListener() { public void mouseDragged(java.awt.event.MouseEvent e) { if( ★ ) { // 枠 pMus = jPanel.getLocation(); jPanel.setLocation(pMus.x + e.getX(), pMus.y + e.getY() ); } else { // 枠以外 jPanel.setSize(e.getX(), e.getY() ); } } public void mouseMoved(java.awt.event.MouseEvent e) { } }); } return jPanel; } private JButton getJButton() { if (jButton == null) { jButton = new JButton(); jButton.setBounds(new Rectangle(16, 25, 82, 58)); } return jButton; } private JButton getJButton1() { if (jButton1 == null) { jButton1 = new JButton(); jButton1.setBounds(new Rectangle(115, 24, 77, 59)); } return jButton1; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { SampleButtonSize thisClass = new SampleButtonSize(); thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); thisClass.setVisible(true); } }); } public SampleButtonSize() { super(); initialize(); } private void initialize() { this.setSize(300, 200); this.setContentPane(getJContentPane()); this.setTitle("JFrame"); } private JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); jContentPane.setLayout(null); jContentPane.add(getJPanel(), null); } return jContentPane; } }

    • ベストアンサー
    • Java
  • Androidの非同期処理でネットワークエラー発生

    Androidから、AsyncTaskを使用してURLにアクセスし、 外部DBのMySQLから引っ張ってきたデータをXML形式に変換したものを 取得したいと思っています。 一通り処理を作成し、実験的にデータを取得してみたのですが、 問題なく取得できるものと、途中でNetworkOnMainThreadExceptionが発生するものが 出てきてしまいました。 具体的には、下記のようなテーブルのデータを全カラム分取得し、 XML形式に変換しています。 【取得に成功したテーブル】 カラム数:3 内訳:INT型→1カラム、VARCHAR型→2カラム 一度に取得するデータ数:7行 【取得に失敗するテーブル】 カラム数:22 内訳:INT型→7カラム、CARCHAR型→12カラム、    TEXT型→1カラム、DATETIME型→2カラム 一度に取得するデータ数:最大10行 NetworkOnMainThreadExceptionが発生するタイミングは、 XMLデータを取得したタイミングではなく、 取得したXMLをデータ格納用オブジェクトに入れて ArrayListに蓄積しているタイミングです。 データが取得できているテーブルもあるので、 AsyncTaskの使い方が間違っているわけではないと思うのですが NetworkOnMainThreadExceptionが発生する原因を調べてみても、 AsyncTaskを使っていないから、というものしか出てこないので、 原因がさっぱりわかりません。 AsyncTaskの使い方で何か間違っている箇所があるのか、 そもそもAsyncTaskで取得させるデータ量に制限があるのか、 何かの指定をすればうまくできるものなのか、 何か思い当たることがあれば、教えていただきたいと思っています。 【AsyncTaskをextendsした自作クラス】 public class AsyncXmlLoader extends AsyncTask<String, Integer, InputStream> { public interface AsyncCallback { void preExecute(); void postExecute(InputStream result); void progressUpdate(int progress); void cancel(); } private AsyncCallback asyncCallback = null; public AsyncXmlLoader(AsyncCallback asyncCallback) { this.asyncCallback = asyncCallback; } @Override protected void onPreExecute() { super.onPreExecute(); asyncCallback.preExecute(); } @Override protected void onProgressUpdate(Integer... progress) { super.onProgressUpdate(progress); asyncCallback.progressUpdate(progress[0]); } @Override protected void onPostExecute(InputStream result) { super.onPostExecute(result); asyncCallback.postExecute(result); } @Override protected void onCancelled() { super.onCancelled(); asyncCallback.cancel(); } @Override protected InputStream doInBackground(String... uri) { InputStream inputStream = null; try { // URLクラスのインスタンス作成 URL url = new URL(uri[0]); // コネクション接続 URLConnection connection = url.openConnection(); // ストリームを取得 inputStream = connection.getInputStream(); } catch (MalformedURLException e) { Log.e("AsyncXmlLoader", e); } catch (IOException e) { Log.e("AsyncXmlLoader", e); } catch (Exception e) { Log.e("AsyncXmlLoader", e); } return inputStream; } } 【実際にデータを取得している箇所】 public class MainActivity extends ActionBarActivity { private final String URL = "http://hoge.jp/test.php"; private TextView testTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // TextViewを取得 testTextView = (TextView)findViewById(R.id.textViewTest); // XMLからカテゴリデータを取得 AsyncXmlLoader xml = new AsyncXmlLoader(new AsyncXmlLoader.AsyncCallback() { // 実行前 public void preExecute() { } // 実行後 public void postExecute(InputStream result) { if (result == null) { Log.e("AsyncCallback", "データ取得失敗"); return; } // XMLのデータを取得して画面に表示 BufferedReader br = new BufferedReader(new InputStreamReader(result)); StringBuilder sb = new StringBuilder(); String line; try { while ((line = br.readLine()) != null) { sb.append(line); } } catch (IOException e) { Log.e("AsyncCallback", e); } testTextView.setText(sb.toString()); } // 実行中 public void progressUpdate(int progress) { } // キャンセル public void cancel() { } }); // 処理を実行 xml.execute(URL); } } お知恵を貸していただきたいと思います。 どうぞよろしくお願いいたします。

このQ&Aのポイント
  • 会社の清算業務を行っており、残余財産の分配方法について詳細を知りたい。
  • 弥生会計で仕訳を行ったが株主資本等変動計算書の印刷ができない状態になってしまった。解決策を知りたい。
  • 手探りで清算業務を行っており、仕訳に不備がある可能性がある。訂正が必要な箇所やアドバイスが欲しい。
回答を見る