The HIRO Says

If you smell what The HIRO is cooking!!!

Javaプログラミング

BigDecimal で見る hashCode() と compareTo() の違い

java.math.BigDecimal クラスを使用すると、hashCode() と compareTo() の違いが分かりやすいと思います。 実装 BigDecimal number1 = new BigDecimal("0"); BigDecimal number2 = new BigDecimal("0.0"); // ★a.equals(b) = true ならば a.compareTo(b) == …

compareTo() メソッド(1)−基本的な実装方法

equals()・hashCode() と同様にオブジェクトの比較に使用できる、compareTo() メソッドについて記述します。 compareTo() メソッドとは?(概要) オブジェクト同士を比較し、どちらが大きいか小さいかを比較することが目的です。 equals() メソッドは、オブ…

hashCode() メソッドの実装(2)−Eclipseに自動生成させてみた

equals() メソッドと同様に、Eclipse(v3.2.0)に hashCode() メソッドを自動生成させてみました。 生成されたコード @Override public int hashCode() { final int PRIME = 31; int result = super.hashCode(); result = PRIME * result + (booleanValue ? 12…

clone() メソッドの実装(2)−オブジェクトの複製テクニック

前回で触れたように、clone() メソッドには、仕様が特殊で実装し辛いという問題があります。 オブジェクトをコピーしたいだけなのに…(´・ω・)という人のために、clone() メソッド以外でオブジェクトを複製するテクニックを紹介します。 テクニック(1)−…

clone() メソッドの実装(1)−基本的な実装方法

Java で Prototype パターンを実現するために必要な、clone() メソッドについて記述します。 clone() メソッドの仕様 いずれも、必須ではないそうです。(´・ω・) x.clone() != x を満たすこと。 x.clone().getClass() == x.getClass() を満たすこと。 x.cl…

hashCode() メソッド(1)−基本的な実装方法

equals() メソッドの姉妹ともいえる、hashCode() メソッドについて記述します。 hashCode() メソッドの仕様 属性に変化がない場合、hashCode() を複数回呼び出しても、常に同一の値を返し続けること。 a.equals(b) = true ならば、a.hashCode() = b.hashCode…

equals() メソッドの実装(5)−Eclipseに自動生成させてみた

Eclipse(v3.2.0)のメニューに、「ソース(S)→hashCode() および equals() の生成(H)」なるものがあったので、どんなコードを生成するのか見てみました。 生成されたコード public boolean equals(Object obj) { if (this == obj) return true; if (!super.equ…

equals() メソッドの実装(4)−データ型による実装の違い

equals() メソッドの実装にあたって、一部のデータ型については特別な処理が必要です。 特別な処理 float型の場合、Float.compare() を呼び出す必要があります。 double型の場合、Double.compare() を呼び出す必要があります。 オブジェクトの参照の場合、そ…

equals() メソッドの実装(3)−transitivity の実現と継承

前回に引き続き、equals() メソッドの規約の1つ、transitivity について触れていこうと思います。 transitivity の意味 transitivity とは、a.equals(b) = true かつ b.equals(c) = true ならば c.equals(a) = true である、という意味です。 前回の symmet…

equals() メソッドの実装(2)−symmetry の実現

equals() メソッドの規約の1つに、symmetry があります。 これは、a.equals(b) が true ならば b.equals(a) も true でなければならないというものです。 イメージし易そうでし辛いので、以下に例を示します。 例 以下のような、何らかのタイトルを意味する…

equals() メソッドの実装 (1)−基本的な規約

equals() メソッドは、java.lang.Object クラスにあるメソッドで、オブジェクト同士が同じか否かを判定するものです。 初めは単純にオブジェクトの field 同士を比較するだけでよいのかと思っていたんですが、Effective Java によると、色々と細かい仕様が決…

TPTPと闘う!(vol.1 もしかしたら最終回)

NetBeansのプロファイラとの比較のため、TPTPをインストールしてみたんですが… JavaSE 6 Update 3 じゃ動かないんですかそうですか。 インストールする前に言って欲しかった…JavaSE 5 を追加でインストールします。。。

面白いSingletonの実装方法

Effective Javaに、EnumでSingletonを実現する方法が載ってました。(1st editionにはおそらく載っていないと思います。) やり方が面白かったので載せます。 Singletonクラス public enum Singleton { SINGLETON; public void doSomething() { // omitted }…

builder pattern

【テーマ】 コンストラクタの引数が多い場合、何か良い方法はないか? 【概要】 GoFのデザインパターンの1つ、builderパターンを使用する方法。 パラメータの設定やimmutableなオブジェクトの生成は、Builderクラスに任せます。 【補足】 インスタンスを生…

JavaBeans pattern

【テーマ】 コンストラクタの引数が多い場合、何か良い方法はないか? 【概要】 いわゆるJavaBeans。 特徴は以下の通り。 privateかつfinalでないfieldを持つ。 引数なしのpublicなコンストラクタを持つ。 fieldには、getter/setterを介してアクセスする。 …

Telescoping constructor pattern

Effective Javaの全項目を網羅してまとめようとしたら内容が多すぎたのでシフトチェンジ。 同著を読んで気がついたテクニックを、少しずつうpしていきます。 完全に自己満足ですええ。(だって英語版難しいんですもの) 補足があったらよろしくです。 【テ…