- PR -

コンスタント値専用クラスについて

投稿者投稿内容
うのきち
ベテラン
会議室デビュー日: 2003/02/17
投稿数: 55
投稿日時: 2003-03-02 12:46
う〜ん、タイプセーフenumって、まだ認知度低いのね。Javaには、enumというキーワードはありませんが、タイプセーフenumという手法で、c/c++のenumよりずっと柔軟に、定数定義が出来ます。最近私は、C++でもタイプセーフenumを使ってるくらいで...

サーチエンジンで検索しても色々解説ページが出てきますが、以下の本を立ち読みしてみるといいですよ。

ピアソンのEffective Java
ASCIIの実践Java
matu
ベテラン
会議室デビュー日: 2002/09/01
投稿数: 95
お住まい・勤務地: 東京
投稿日時: 2003-03-02 13:43
 こんにちは。

 コンパイル時のコンスタント値展開は本当なのでしょうか?
テストしてみます。
 私はpublic static final使用時にクラスまるごとメモリに
ロードされるものだと思っていました。その後使われない場合
はGCにより解放されるのだと思ってました?

 あとタイプセーフenumはJAVAのデザインパターンとして存在
しているのですね!?とても気になるので本屋に行ってきます。

 ちなみにXMLでのプロパティー管理ですが、私も前から実現
したいと思っているのですが、これはDOM、SAX各々の問題点か
らするとコンスタント値というよりconfigファイルレベルまで
に使用する、というのが私の中での現在の結論です。もう少し
使いやすいものになれば別ですが。
matu
ベテラン
会議室デビュー日: 2002/09/01
投稿数: 95
お住まい・勤務地: 東京
投稿日時: 2003-03-02 15:14
 コンスタント値ですが、
 テストしてみました。色々やってみましたがコンパイル時に
展開される様です。

 タイプセーフenumですが本屋さんに本がなかったのでWEBを
調べてみたのですが、あまり資料がありません。
 こんな感じでしょうか?
public class Test1 {
  private final String a;
  private final int b;
  private Test(String a) { this.a = a; }
  private Test(int b) { this.b = b; }
  public String stringValue() { return a; }
  public String intValue() { return b; }
  public static final Test A = new Test("testa");
  public static final Test B = new Test(1);
}
 よくわからないのですが使うメリットはどの様なものでしょうか?
うのきち
ベテラン
会議室デビュー日: 2003/02/17
投稿数: 55
投稿日時: 2003-03-02 15:30
ちょっと違います。簡単に説明しきれるものでもないので、ちゃんとした説明は書籍をあたってみてください。Effective Javaあたりは、Javaをやるなら、買っておいて損は無いと思いますよ。Amazonでも注文できますし。

メリットは、パッと思いつくには、
自動的に管理される。
enumだと、番号定義を、継承クラスで増やしたい場合、結局WM_USERみたいなのを決めて、その後から使おうってなりますが、みんながWM_USER以降を使っちゃったら、それらを一緒に動かす時に番号がぶつかりますよね。タイプセーフenumだと、そのあたりが自動的に管理されるので、ぶつかることがありませんし、コンパイルし直す必要すらありません。

ログの内容の可読性が高まる。
enumだと、結局のところ整数で定義するので、アプリケーションのログには整数しか残りません。なので、その整数が何を意味するのかは、常に、そのログを吐いたアプリケーションと同期したソースコードを見ないと分かりません。タイプセーフenumだと定数自体に文字列表現が入っているので、ログにも文字列表現が残ります。
DaikiRyuto
大ベテラン
会議室デビュー日: 2002/07/23
投稿数: 200
投稿日時: 2003-03-03 02:53
引用:

よくわからないのですが使うメリットはどの様なものでしょうか?



列挙は「複数の意味を持つ特殊な(数値や文字列ではないような)型」の定義のために使います。
なので、「システムのコンスタント値」とやらが、画面のタイトル名などの意味のある文字列や、あるいは数値として意味のあるものであれば、列挙を考える必要はないと思います。
asip
ベテラン
会議室デビュー日: 2001/12/27
投稿数: 77
投稿日時: 2003-03-03 04:05
>うのきちさん
>う〜ん、タイプセーフenumって、まだ認知度低いのね。
タイプセーフenumパターンってのがあったんですね。

>タイプセーフenumですが本屋さんに本がなかったのでWEBを
>調べてみたのですが、あまり資料がありません。
googleで「typesafe enum java」&「web全体から検索」すると多数ヒットします。

その一つが
http://developer.java.sun.com/developer/Books/shiftintojava/page1.html
です。もちろん、英語です。WEB上に日本語での資料はありませんね。
matu
ベテラン
会議室デビュー日: 2002/09/01
投稿数: 95
お住まい・勤務地: 東京
投稿日時: 2003-03-03 11:19
引用:


列挙は「複数の意味を持つ特殊な(数値や文字列ではないような)型」の定義のために使います。
なので、「システムのコンスタント値」とやらが、画面のタイトル名などの意味のある文字列や、あるいは数値として意味のあるものであれば、列挙を考える必要はないと思います。




 Sunのsubstitutes for missing C constructs or C's enum construncts
も読んでみましたが、今の段階では通常のコンスタント値の場合以外のメリット
が理解できていません。確かに列挙のコンスタントや機能拡張にはこのパターン
を使うのが最適ですね?
 でも理解しきれていない部分もあるかもしれません。英語なので飛ばし読みし
たので・・英語だとどうも全部読む気力がなくなってしまいます。。
 
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2003-03-03 11:40
Typesafe enumパターンなら、java.nio.ByteOrderクラスなどで
既に使われています。
# 日本語版APIリファレンスでは「型保証された列挙」と訳されていますね。

Typesafe enumパターンは単体で使用しても十分効果的なパターンですが、
全ての列挙値をCollectionで管理したり、
Strategyパターンなど他のデザインパターンと組み合わせて使うと
非常に便利です。
# エラーコードのようなものの管理は、もはやTypesafe enumパターン
# なしには考えられません。

その魅力をこの狭いスペースで伝えることは到底できませんので、
asipさんが紹介されたページや、Effective Javaを一読されることを
お勧めします。

スキルアップ/キャリアアップ(JOB@IT)