Java

コンパイル時警告に注意

http://aoking.hatenablog.jp/entry/20100427/1272326219での主張は public class Sample { public static void main(String[] args) { List<Integer> list = getList(); System.out.println(list); } public static <T> List<T> getList() { List<T> list = new ArrayList<T>(); </t></t></t></t></integer>…

可変長な型変数の表現

さて、前回のエントリを枕として、JavaでTuple的なモノのサンプルを書いたのだけど、汎用のTupleというか、値を2つだけとるPairとでも名乗るべきモノだった。みなさん御存知の通り、型変数は可変長に宣言することができない。そもそもJavaの文法的には型変…

ふたつのIterator

コードを書いているとたまにふたつのIteratorをいっしょに回すコードを書くはめになる。 /** ふたつのItaratorを並べて回すサンプル */ static boolean compare1(List<String> list1, List<Integer> list2) { if (list1.size() != list2.size()) { throw new IllegalArgumentE</integer></string>…

富山の勉強会に参加する際の心構え

IT勉強会はなにも東京ばかりで開催されているわけではない。 地方の勉強会に参加するのであれば、ついでに観光地を巡ったり、その土地の美味しいモノを食べたいというのが人情である。本エントリでは富山の勉強会に来た際に食べるべきものを紹介する。 氷見…

Java書けるんなら当然JavaScript呼び出せるよね?

上司「Java書けるんなら当然JavaScript呼び出せるよね?さっさとやっておいて」 JavaからJavaScriptを呼び出す Java 6 からスクリプトAPIを通じてスクリプト言語を呼び出すことができる。Java標準でJavaScriptのエンジン Rhinoが組み込まれているので特にイ…

new T()したいケースへの対処法

Javaのジェネリクスの話題のひとつにnew T()したいができないので困る、というテーマがある。 先日のセッションではこの対策についても簡単に述べたが今日はそのまとめ。まず第一に疑うべきは本当にnew T()する必然性があるか?というのが持論だが、ある種の…

Semicolonless Java8

JJUG CCC 2013 Fallの懇親会のLT(ライトニングトーク)でSemicolonless Java8について発表しました。Semicolonless Java とはエクストリームプログラミング(要するにプログラミングの縛りプレイ)でルールは以下のとおりです。 セミコロンを用いてはいけない …

JJUG CCC 2013 Fall でジェネリクスのセッションやりました

資料はslideshareに上げました。ジェネリクスの基礎と クラス設計への応用 ジェネリクスの基礎と クラス設計への応用 from nagise 内容はジェネリクスの基礎的なところから、話題を網羅する感じでかいつまんで紹介といったところです。 セッションの元ネタは…

Javaのジェネリクスとリフレクション応用編

前回から随分と間が開いてしまった。Javaのジェネリクスはイレイジャ方式だけどもクラスにバインドした型の情報が残る場合があるんだよシリーズの第2弾である。具体的にどういう場合にバインドした型が残るのかという話だが、端的に列挙すると以下のものであ…

高階型変数のパラダイム分析

前稿 ジェネリクスのカリー化 - プログラマーの脳みそ では、Javaの内部クラスを利用して複数の型変数をもつジェネリックなクラスをカリー化することができるという話をした。では以前のJavaによる高階型変数の実装 - プログラマーの脳みそで用いた手法はカ…

ジェネリクスのカリー化

関数を扱えるだけでは、モナドを表現するには不十分過ぎる - xuwei-k's blogを見て、言語の型システムの表現力とその限界とはなんなんだろうということをモヤモヤと考えていた。ここで話題になっているのは型変数を持つ型変数という話題である。これを便宜的…

Javaのジェネリクスとリフレクション

今回のテーマはジェネリクスとリフレクション。Javaのジェネリクスはイレイジャ方式なのでリフレクションでは何も得られないと思ってはいまいか。 public void hoge(List<String> list) {} といったメソッドがあったとして、リフレクションでこのメソッドの情報を得</string>…

再帰ジェネリクスのthisとTの互換性

再帰ジェネリクスを用いて以下のようなコードを書いたとする。 Hogeを継承した型を作った場合に具象型を得るgetThis()メソッドを使えるようにしたいわけだ。 public class Hoge<T extends Hoge<T>> { @SuppressWarnings("unchecked") public T getThis() { return (T) this; } </t>…

ジェネリックな設計 再帰編

11/10に開催されたJJUG CCC 2012 Fallでジェネリクスについてセッションを行いました。このエントリはセッション内容を補足するものです。基礎的な内容はJavaジェネリクス再入門 - プログラマーの脳みそ ジェネリックな設計 基礎編 - プログラマーの脳みそな…

ジェネリックな設計 基礎編

11/10に開催されたJJUG CCC 2012 Fallでジェネリクスについてセッションを行いました。このエントリはセッション内容を補足するものです。本セッションはジェネリックなクラスの設計を行えるようになって欲しいという狙いで話をしました。ジェネリックなクラ…

ジェネリクスによるVisitorパターン拡張の考察

先日twitterで "Expression Problem" という問題を知った。 静的な型付けの下で、場合分けのデータ構造に対して、新しい場合分けとその場合に対する新しい処理を、元のソースコードに手を加えることなく拡張定義すること 2009-05-16 この問題が意図するとこ…

Semicolonless Java 2012

JavaOne Tokyo 2012でLTをしてきました。内容は寺田さんの要請でSemicolonless Java(セミコロンレス・ジャバ)です。当日は風邪で喉をやられたので音声が聞き取りにくかったと思います。申し訳ないです。公式のフォトライブラリーがあるので当日の会場の雰…

Javaのクラス宣言5種+α

Javaのクラス宣言には5種類ある。 トップレベルクラス・ネストしたクラス・内部クラス・ローカル内部クラス・匿名クラス(無名クラスとも言われる)の5種類だ。 今回はこの5種類のクラス宣言のおさらい。 トップレベルクラス これは普段使っているクラス。拡張…

ProxyパターンとProxyクラスと黒魔術

Java Advent Calendar 2011 の18日目です。17日目の記事は JavaEE使ってウェブアプリケーションつくろうよ - 水まんじゅう2、 19日目はJavaエバンジェリストの寺田さんですよ。乞うご期待。 プロローグ 後:「先輩、いまさらなんですけど上からSQLの遅いとこ…

Threadの割り込みを活用する

確実に一定時間スリープする - terazzoの日記ではThreadの割り込みがあっても確実に一定時間の停止を試みているが、そもそもこのようなコードは書いてはいけない。Thread.sleep()は一定時間止まるための便利メソッドとしてよく知られているが、そのときに発…

二重ループのバグ

太郎くんはJavaでコマンドラインから渡された英文字("zero", "one", "two", "three")をアラビア数字(0, 1, 2, 3)に置き換えるコードを書いた。 public class Sample { static String[] values = {"zero", "one", "two", "three"}; public static void main(S…

Java7 ジェネリクスのダイアモンド・オペレータ

Java 7がリリースされました。もう随分前から7の話題はあったものの、ずっと延期されてたんで出た事自体が不思議な気がしますが、皆様いかがお過ごしでしょうか。Java 6が2006年12月ですからほぼ5年も経ってしまったのですね。Java 7のリリースノートは Java…

異型のオブジェクト比較

異なる型のオブジェクトの順序比較が今回のテーマ。Javaの場合、オブジェクトの順序を比較する王道はふたつある。ひとつはjava.lang.Comparable *1(こんぺあらぶる)を実装する「自然順序付け」と呼ばれる方法。 public class A implements Comparable<A> { in</a>…

Javaパフォーマンス計測 JITとの闘い

前回の文字列操作編では適当に文字列操作のパフォーマンスを測定しようとしたらGC様とJITコンパイラ様に阻まれた、という話だった。モヒカン族*1が「てめえの計測はなっちゃいねー!ひゃっはー!」と殴りかかったらケンシロウみたいなのが出てきて「あべしっ…

Javaパフォーマンス計測 文字列操作編

前回でパフォーマンス計測に用いるタイマーについての理解を深めたので、やっとパフォーマンスの計測を始めることができる。今回のテーマはJavaの文字列連結だ。タイムリーだね。 文字列連結についての基礎知識 Javaの文字列連結についての言語仕様まわりは …

Javaパフォーマンス計測 そんなタイマーで大丈夫か?

駄目だ。大問題だ。 long t1 = System.currentTimeMillis(); long t2 = System.currentTimeMillis(); System.out.println(t2-t1); 結果はなんとでるか? 99.9%以上の確率で0が表示される。そもそもSystem.currentTimeMillis()は時刻をミリ秒で返す。1行のプ…

Java 30byte FizzBuzz

なっちゃん(以下な)「なんかさー。タイトルが無理すぎない?」 ぎぃくん(以下ぎ)「まあ流行りだからね」 せっちゃん(以下せ)「流行りって言ってもFizzBuzzを30バイトで - Togetterが1/24だし、1週間経ってるけど。どちらかと言えばオワコン?」 な「…

Javaによる高階型変数の実装

高階関数というものをご存知か。関数自身を引数あるいは戻り値に取る関数のことである。「高階」は「こうかい」と読む。その昔「たかしな」と読んだ人がいたとか、いないとか。先のエントリ「HttpSessionを型安全にする」では「javax.servlet.http.HttpSessi…

HttpSessionを型安全にする

Servletをやった人はおなじみのjavax.servlet.http.HttpSessionのsetAttribute()/getAttribute()のようなモノをどうやって型安全にするかというのが今回のテーマ。擬似的にはjava.util.Map型へのput/getだと思ってもらっていい。通常、Mapを使う際はキーの型…

ジェネリクスの代入互換のカラクリ

Javaジェネリクス再入門 - プログラマーの脳みそでは、「変数の型の宣言」の項で「ジェネリクスの<>の中は一般のJavaの型の代入互換性とは異なる。このことはよく覚えておかなくてはいけない。」と言ったものの、深入りはしなかった。このあたりについて深入…