タグ

ブックマーク / nagise.hatenablog.jp (4)

  • 贖罪のイレイジャ - プログラマーの脳みそ

    Javaのジェネリクスでしばしば話題に上がる「イレイジャ」について整理しておきたい。 イレイジャについては僕もいろいろと誤解しており、過去に誤った発言をしている。エントリはその贖罪として書かれたものである。 「イレイジャ」という方式についてはネガティブな誤解が広まっていると思う。「イレイジャ方式」が問題の根ではない事象について、それを「イレイジャのせい」であると誤って理解することはエンジニアとしてはマイナスである。 しばしばイレイジャのせいとされる事象にnew T()できないという論点があるが、これはJavaのジェネリクスがC#でいうnew制約(型変数の制約としてデフォルトコンストラクタを持つことを要求する機能)を持たないことに起因する問題である。 そのため、この点についてJavaの言語仕様に改善を求めるのであれば、new制約を導入せよという現実的な要求とするべきである。 イレイジャ方式

    贖罪のイレイジャ - プログラマーの脳みそ
    waman
    waman 2016/05/22
  • FutureTaskのコンストラクタと魔法のバインド - プログラマーの脳みそ

    java.util.concurrent.FutureTaskのコンストラクタの定義が public FutureTask(Callable callable) http://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/FutureTask.html#FutureTask-java.util.concurrent.Callable- とCallable<V>となっていてCallable<? extends V>じゃないのが不便だという話題。 これにより Thread Safe な汎用オブジェクトCache - がくぞーのメモ のキャッシュ機構のコンストラクタをCallable<? extends V>に出来ないのだとがくぞさん(@gakuzzzz)が嘆いていたので、小手先のテクニックで対応したのが以下のコード。 imp

    FutureTaskのコンストラクタと魔法のバインド - プログラマーの脳みそ
  • Java8流インスタンスを生成するメソッドの書き方 - プログラマーの脳みそ

    メソッド内部で任意の型のインスタンスを生成してオブジェクトを返す場合 public static <T> T hoge(Class<T> clazz) { try { return clazz.newInstance(); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } } といったようにjava.lang.Classを引数にとり、リフレクションでインスタンス生成するというのが常道だった。 対象となるClassにはデフォルトコンストラクタ(引数なしのコンストラクタ)が存在することが前提となる。 呼び出し側は以下のように 型名.class を渡す。 String string = hoge(String.class); これがstataicメソッドではなく、thisオブジェクトが継承による

    Java8流インスタンスを生成するメソッドの書き方 - プログラマーの脳みそ
    waman
    waman 2015/02/26
  • Javaの型システムとコンストラクタ - プログラマーの脳みそ

    今回はJavaの型システムのコンストラクタについて考えてみたい。 Javaの型システム、あるいはJavaのオブジェクト指向において、コンストラクタという存在は特殊な存在だ。 コンストラクタ内からはそのクラスのインスタンスフィールドにアクセスできる。これは通常のインスタンスメソッドと同等のスコープであってstaticメソッドのそれとは異なる。しかし、コンストラクタを呼び出すにあたってはインスタンスのメソッドという体ではなく、staticメソッドのように(インスタンスではなく)クラスに属するものとして呼び出すことになる。(もっともnewという専用のキーワードを用いるのでそうは見えないかもしれないが) クラスやinterface、つまりJavaの「型」によるポリモフィズムの世界を考えるとき、コンストラクタはのけものである。継承関係を持つクラスであってもコンストラクタは継承されないし、オーバーライ

    Javaの型システムとコンストラクタ - プログラマーの脳みそ
    waman
    waman 2014/08/14
  • 1