Javaプログラミング
急遽 Java で LDAP にアクセスしなければいけなくなったのですが… jldap?jdbc-ldap? もっと簡単なのは無いの? というわけで調べてみたら、↓やっぱりこんなのがあるのね。 http://s2directory.sandbox.seasar.org/ja/ S2Dao が分かれば使えるっぽいのが魅…
前回、インターフェースを使って enum のメソッドを定義する方法を説明しました。 今回は、strategy パターンを使って enum のメソッドを定義する方法を説明します。 今回の仕様 今回は、とある会社の営業月を表す BusinessMonth クラス(enum)を定義するこ…
前回、1つの enum クラスの中で abstract メソッドと concrete メソッドを定義する方法を説明しました。 今回は、インターフェースを使って enum のメソッドを定義する方法を説明します。 ちなみに今回も、四則演算の例で説明します。 手順(1)−インター…
enum では、メソッドの定義方法にもいくつかテクニックがあります。 今回は、そのうちの一つ、constant specific method implementation について説明します。 前提−四則演算を表す enum を定義する 加減乗除の四則演算を表す、ArithmeticOperation という e…
enum には、変数とメソッドを定義することもできます。 …といっても、基本的な定義方法は、通常のクラス定義と同じです。 ただ、それだけだと面白みがないので、今回は enum ならではの定義方法を説明しようと思います。 enumならではの変数の定義方法 定数…
まず、enum 型の基本的な定義方法を見て、enum 型のメリットを確認してみましょう。 定義の仕方 型は、class でも interface でもなく、enum を指定します。 型なしで、定数名のみを順番に定義します。 定数は、順番にカンマ区切りで定義し、最後はセミコロ…
enum とは、平たく言えば「セットで意味をなす定数の集合」のことです。例えば、四季は春・夏・秋・冬の4つの要素から成り立ちますよね。 この場合、春・夏・秋・冬をそれぞれ定数とする「四季」という enum がある!と考えることができます。 1.4まで J2SE…
前回、generic メソッドの型パラメータを柔軟にする手法としての PECS を紹介しました。 今回は、具体例を通して、PECS の適用方法を確認していこうと思います。 PECS適用前 2つのリストの要素を合体させる、addAll() というメソッドを考えてみましょう。 p…
型パラメータには、という書き方もあります。 今回は、この super について説明します。 例 前回使用した Stack クラスに、popAll() メソッドを定義するとします。 popAll() メソッドは、Stack の要素を全て、引数の Collection に add するという内容としま…
型パラメータ(<E>とか)には、という書き方もあります。 今回は、この extends について説明します。 例:Stack クラス ひとまず、下記のような API の Stack クラスを想定して下さい。 (各メソッドの実装は、説明に影響がないので省略しています。) public </e>…
primitive 型よりも boxed primitives(primitive のオブジェクト型)の方がパフォーマンスが落ちるということなので、簡単なプログラムで調べてみました。 今回調べたのは、ひとまず実行時間だけです。 環境 OS Windows XP Home Edition Version 2002 SP3 C…
for each とか forEach とか色々な書かれ方があるけれども、Effective Java では「for-each」とのこと。 以前の for 文よりも簡単に書けるので便利。 (1)配列の for 文 String temp = null; for (int i = 0; i temp = array[i]; System.out.println("leng…
例えば String のリスト list を for ループで回したい場合。 よろしくない方法 この方法だと、ループの度にリストの size() メソッドを呼び出すことになるので、パフォーマンス上よろしくない。 for (int i = 0; i ; i++) { 少し改善した方法 for ループの…
前回(immutable object)、変数を private かつ final にしても、変数が参照型かつ mutable な場合、値を変更できることがあることについて触れました。 今回は、その詳細および対処方法としての”defensive copy”について説明します。 1.具体例 前回作成…
”immutable object”。 日本語で言うと「不変オブジェクト」。 これは、「一度値を設定したら値を変更できないクラス/オブジェクト」のことです。 いつどこで使う? 動作中に値を変えられては困るクラスを定義する場合が挙げられます。 例えば、とあるデータ…
以前、generics では実行時に型情報がなくなることを紹介しました。 これを singleton とうまく合わせると、任意の型を扱える singleton を定義できます。 手順 generic なインターフェースを作成する。 generic なインターフェースを返すファクトリクラスを…
単体テストを作成していると、たまにテスト対象クラスの private 変数を検証したくなることってありませんか? そういう時は、例えば以下のように、リフレクションを使いますよね。 // target は、テスト対象クラスのインスタンスと考えて下さい。 // privat…
例えば、HashMap を定義する場合、 Map map = new HashMap(); のように、左辺・右辺で同じ型パラメータを書く必要があります。 でも、同じものを2度書くのは面倒!という場合もあるかと思います。 そういう場合は、こんなメソッドを作ってみましょう。 publ…
前回、generic なリストは実行時に型チェックできないと説明しました。 ただ、正直これだけだと、「内部的にはそうかもしれないけれど、プログラムを組むだけならば関係ないや」という気になりがちだと思います。ですが、これが具体的にプログラマに影響を与…
配列と generic なリストでは、実行時の型チェックについて以下の違いがあります。 配列は、実行時に型チェックを行える。 リストは、実行時に型チェックを行えない。 どういうことなのか、以下で説明します。 配列の場合 配列は、コンパイル時には型チェッ…
Java プログラマ的には、だいたい同様のものとして扱われる配列(String[])とリスト(java.util.List)。 これを generics の観点からみると、これらの間にいくつかはっきりした違いが見受けられます。 以下、3回に分けて、配列とリストの違いについて記述…
百聞は一見に如かず。 実際にコードを書いて、generics のありがたみを確認してみましょう。 generics を使用しない場合 // String が入る想定のリストを定義する。 List stringList = new ArrayList(); // 値を追加してみる。 stringList.add("1"); // Stri…
J2SE v1.5(Tiger)から新たに追加された generics。 端的に言うと List。 そもそもこれの役割が何なのかを、改めて見直してみました。 役割 generics の役割は、大きく次の2つにまとめられそうです。 (1)キャストをなくす J2SE 1.4 以前では、List や M…
generics を使っていると、コンパイル時に色々な警告に遭遇します。 原則これらは簡単に除去できるんですが、中にはどうやるの?というケースもあります。 今回は、そういう特殊なケースについて記述します。 特殊な警告例 次のコードは、java.lang.List#get…
前回、「何で countElements(Set<E> set) と定義するとコンパイルエラーになるのか?」という宿題があったので、それを解いていきます。 やりたいこと Set を引数にとり、その要素数を返すメソッドを定義します。 で、Set の型を任意にしたい+ を使いたくない</e>…
石田さんに詳しいことを調べていただいたので、それをベースにコードを組んでみました。 (石田さんありがとうございました m(_ _)m) コードの実装例 引数の Set に格納されている要素数を返すメソッドを考えてみましょう。 private int countElements(Set …
Generics の型パラメータに "?" を指定できるとのことなので試してみました。 例えば、こんな定義のメソッドがあると考えて下さい。 public void setValue(Set set, Object value) で、set に value を add しようとするとどうなるでしょう? 答えは、コンパ…
char をインスタンス変数で定義して、特に何も値を設定せずに toString() してみたら、値が文字化けしました。 char の初期値は 0? char の初期値は、int と同じで 0 だと思っていたんですが、これ自体はあっていました。 ただ、int の 0 と char の 0 って…
Java をさわったことがある人ならば必ず実装したことがあるはず、toString() メソッドについて記述します。 toString() メソッドのデフォルト実装 特に toString() をオーバーライドしないでオブジェクトを標準出力すると、よく "Order@163b91" とか出力され…
compareTo() メソッドの親戚ともいえる、Comparator について記述します。 Comparator とは? オブジェクト同士を比較し、どちらが大きいか小さいかを判定することに特化したクラス(或いはインターフェース)です。 そのため、役割は compareTo() メソッド…