タグ

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

  • ジェネリックな設計 再帰編 - プログラマーの脳みそ

    11/10に開催されたJJUG CCC 2012 Fallでジェネリクスについてセッションを行いました。 このエントリはセッション内容を補足するものです。基礎的な内容は Javaジェネリクス再入門 - プログラマーの脳みそ ジェネリックな設計 基礎編 - プログラマーの脳みそ などを参照してください。 再帰的ジェネリクス public class Hoge<T extends Hoge<T>> このように、型変数Tに対して境界を宣言したクラスHoge自身にした型変数をもつかたちを指して再帰ジェネリクス・再帰的ジェネリクスなどと呼びます。 このような型変数Tはパラメータ化された型として変数宣言に用いようとすると Hoge<?> hoge; といったようにワイルドカードを用いないと宣言できません。また、newによって型をバインドしようとしても型をバインドすることができません。 再帰的な型変数を

    ジェネリックな設計 再帰編 - プログラマーの脳みそ
  • ジェネリックな設計 基礎編 - プログラマーの脳みそ

    11/10に開催されたJJUG CCC 2012 Fallでジェネリクスについてセッションを行いました。 このエントリはセッション内容を補足するものです。セッションはジェネリックなクラスの設計を行えるようになって欲しいという狙いで話をしました。ジェネリックなクラスを利用できるというのは前提条件として書いてます。入門的な内容であれば Javaジェネリクス再入門 - プログラマーの脳みそ を参考にしてください。 セッション資料はこちら ジェネリクスの基礎と応用 JJUG CCC 2012 Fall ジェネリクスのスコープ まずジェネリクスのスコープの話から入ります。Javaのジェネリクスには2つのスコープがあります。 メソッドをスコープとした型変数 インスタンスをスコープとした型変数 後者はおなじみの public interface List<E> などの型変数です。 これに対して pub

    ジェネリックな設計 基礎編 - プログラマーの脳みそ
  • オワコンであるVectorとListの同期の話 - プログラマーの脳みそ

    JJUG Night Seminarへ行ってきました - 虎塚にあったjava.util.Vectorの話。 java.util.Vectorは随分前にオワコン化していて、今、新たにVectorを使ってコードを書く人がいたら優しく諌めてあげるべきシロモノ。 「VectorとArrayListだとArrayListの方が同期化されていなくて速いです!」と習った人も多いのではないかと。 public synchronized E get(int index) { if (index >= elementCount) throw new ArrayIndexOutOfBoundsException(index); return elementData(index); } これはJDK7u7のVectorのコードのうちget()の部分の抜粋なのだけど、synchronizedメソッドになってる。s

    オワコンであるVectorとListの同期の話 - プログラマーの脳みそ
  • ジェネリクスによるVisitorパターン拡張の考察 - プログラマーの脳みそ

    先日twitterで "Expression Problem" という問題を知った。 静的な型付けの下で、場合分けのデータ構造に対して、新しい場合分けとその場合に対する新しい処理を、元のソースコードに手を加えることなく拡張定義すること 2009-05-16 この問題が意図するところを語るにはまずオブジェクト指向から流れを辿らねばなるまい。 オブジェクト指向のポリモーフィズム Javaのようなオブジェクト指向の言語で、ある特定のメソッドがあることを抽象クラスHogeで保証するとしよう。 public interface Hoge { void hoge(); } このとき、機能性、つまりメソッドというのは増えることがない固定のものだが、継承して実装されたクラスというのは自由に増やすことができる。そして、抽象型Hogeを扱っている既存コードは修正する必要がない。 これはいわゆる開放/閉鎖原則(

    ジェネリクスによるVisitorパターン拡張の考察 - プログラマーの脳みそ
  • Threadの割り込みを活用する - プログラマーの脳みそ

    確実に一定時間スリープする - terazzoの日記ではThreadの割り込みがあっても確実に一定時間の停止を試みているが、そもそもこのようなコードは書いてはいけない。 Thread.sleep()は一定時間止まるための便利メソッドとしてよく知られているが、そのときに発生するInterruptedExceptionについての理解は広まっていない気がする。割り込みとはなんなのか。どういう時に使うのか。 目覚まし時計 お昼休みに昼寝をしようとする。寝過ごすといけないので15分後にアラームを鳴らす設定をした。 さて、ひと眠りするか、というところに友人がやってきた。昼寝はやめて売店に行くことにした。果たして売店でアラームが鳴り始めた。 さて、このとき、アラームは15分間の待機を命じられたわけだけども、お昼寝がキャンセルされたことで、もう待機しなくてよくなってしまった。むしろ、さっさと待機をやめてく

    Threadの割り込みを活用する - プログラマーの脳みそ
  • Java 30byte FizzBuzz - プログラマーの脳みそ

    なっちゃん(以下な)「なんかさー。タイトルが無理すぎない?」 ぎぃくん(以下ぎ)「まあ流行りだからね」 せっちゃん(以下せ)「流行りって言ってもFizzBuzzを30バイトで - Togetterが1/24だし、1週間経ってるけど。どちらかと言えばオワコン?」 な「まあまあ」 ぎ「とりあえず、どのぐらい無理っぽいか見てみるかい?」 普通のFizzBuzz せ「じゃぁまあ普通のFizzBuzzをみてみましょ。」 な「FizzBuzz Javaでググって…これかな? Fizz Buzz - Semicolonless Java」 public class FizzBuzz { public static void main(String[] args) { for (int i : new int[] { 0 }) { while (++i <= 100) { if (i % 15 == 0)

    Java 30byte FizzBuzz - プログラマーの脳みそ
    Naruhodius
    Naruhodius 2011/02/02
    例外出ても良いってのはアリなんですか
  • Javaによる高階型変数の実装 - プログラマーの脳みそ

    高階関数というものをご存知か。関数自身を引数あるいは戻り値に取る関数のことである。「高階」は「こうかい」と読む。その昔「たかしな」と読んだ人がいたとか、いないとか。 先のエントリ「HttpSessionを型安全にする」では「javax.servlet.http.HttpSessionのsetAttribute()/getAttribute()のようなモノをどうやって型安全にするか」という動機付けから、 public class KeyValue<K> { public <T> void put(K<T> key, T value){} } といったことをやろうとして、Javaの言語仕様上、型変数に型変数を持たせることができないので実現できないと述べた。 簡単に解説すると、ここでKayValueはHashMap的なキーを渡せば値を返すオブジェクトで、型変数Kはキーの集合体を表現している。ty

    Javaによる高階型変数の実装 - プログラマーの脳みそ
    Naruhodius
    Naruhodius 2011/01/25
    ヒョエー
  • Javaでセミコロンなしでプログラムを書く - プログラマーの脳みそ

    java-ja温泉2日目の夕。 @yoshiori がpythonのワンライナの楽しさを得々と語っていた。 @yoshiori「Brainf*ck を Python-oneliner にコンパイルする Python-onelinerを書いたけど全ッ然反応がなかった。こんなに面白いのに!」 @yamashiro「だって分かりにくいもん」 西尾先生が通常ワンライナではtry-catchが使えないけど子プロセス立ち上げて例外を出力してパースすればエラー処理ができるとか(http://www.nishiohirokazu.org/blog/2006/08/python_12.html参照)そんな話で盛り上がる中、 @nagise「Javaでセミコロンなしでプログラムが書けるような気がしてきた」 Javaの場合、普通にセミコロン(;)でマルチステートメントにかけるのでただ1行にしようというなら改行

    Javaでセミコロンなしでプログラムを書く - プログラマーの脳みそ
  • Javaバイトコードの読み方 - プログラマーの脳みそ

    Javaのデバッグをしていて、ステップ実行中にステップインを繰り返したらソースコードのないところに行き当たったことがあるだろう。あるいはEclipseでF3キーでクラスやメソッド・フィールドの宣言元を辿っていってソースコードのないところに行き当たったことがあるだろう。 Eclipseの場合、"Class File Editor"というものが開く。そこにはJavaのバイトコードのニーモニックがズラズラと並んでいて、「これは読めないや、ワケが分からない」と投げ出してしまったりしていないだろうか。 怖がることはない。ちょっとコツを掴めばすぐに読めるようになる。 Class File Editorの開き方 自前のJavaクラスの場合、ビルドして出来上がったclassファイルを開く必要がある。"Package Explorer"だとclassファイルは隠されていて見えないのでWindow -> Sh

    Javaバイトコードの読み方 - プログラマーの脳みそ
  • Java変態文法最速マスター - プログラマーの脳みそ

    Java基礎文法最速マスター - いろいろ解析日記をリスペクト。 Javaの変態文法・技法一覧です。Javaの基礎をある程度知っている人はこれを読めばJavaの変態をマスターしてJavaを書くことができるようになっています。簡易リファレンスとしても利用できると思いますので、これは足りないと思うものがあれば教えてください。 1.基礎 エンクロージング型内部classの作成 外部classのインスタンスに紐付くインスタンスを生成します。外部クラスのインスタンス - 内部クラスのインスタンス間に、クラス - インスタンスのような関係を持たせることができます。 public class Outer { public class Inner { } } というようなクラスを作った場合、 Outer o = new Outer(); Inner i = o.new Inner(); となります。new

    Java変態文法最速マスター - プログラマーの脳みそ
    Naruhodius
    Naruhodius 2010/02/03
    うひー
  • 結婚します - プログラマーの脳みそ

    昨年は葬式で終わるような年だったのだけど、年も明けたところでめでたい話を。私、このたび結婚することになりました。 結納とか結婚式とか この手の風習は地域性もあるから一概には言えないのだけど、親父が言うには、新郎とその両親、仲人が新婦の家を訪ねて、新婦の一族とお祝いをするのが結納、新婦とその両親、仲人が新郎の家を訪ねて新郎の一族とお祝いするのが結婚式だったそうな。*1 今では家もそれほど広くないし、自宅で結婚式の宴会をやるのも大変なので会場に新郎新婦の親族を一同に集めて宴会する形式になっちゃったわけですね。それに友人知人や仕事関係の人とか入り混じってターゲットがごちゃまぜでどうもてなしていいのか分らないような感じになっちゃってるんですね。 高いお祝い金を包んで退屈で窮屈な披露宴にいったことはないですか? そもそも披露宴とか友人を広く呼ぶと費用もかかるから簡単に呼べないんですよね。友人知人をど

    結婚します - プログラマーの脳みそ
  • 誰かをビキビキさせる発言 - プログラマーの脳みそ

    誰かをピクッとさせる発言:Geekなぺーじを見て、人を怒らせる方法というのが見えた気がした。 発言の中に、そのことが全く分かっていないことが推定される内容を含み、かつ、非難するという発言は、人を怒らせる効果が高いのではないか。 2.JavaScriptってJavaの真似だよね は、JavaScriptJavaが似ても似つかない言語であることを知っている人は決して言わない。そして似ても似つかないことは、さわりだけ学べばすぐわかるわけで、こいつはどれだけ分かってないんだよ、と思わせる。それでいて否定的にモノを言うという「お前が言うな」感がとてもビキビキくる。 論理的整合性をまったく欠く文章で「論理的整合性がない」と罵倒するというのは、人を怒らせる事を目的とするならとても効果的だろう。「お前が言うな」の極みで先手を取って「間違っているのはお前の方で、俺は合っている」といい続ければ、そりゃぁもう

    誰かをビキビキさせる発言 - プログラマーの脳みそ
  • 1