2005年12月10日

もやっとシリアライズ - java.io.Serializableのメモ

RDBへデータを格納するときなどに、データの永続化とか、なにやら格好いい言葉が使われている java.io.Serializable。
APIガイドを見てみるとデータの「直列化」と書かれている。
いったいこれは何を意味する物なのか調べてみた。

直列化に関する個人的な見解

XMLでSerializable

単純にシリアライズを行うと、独自のフォーマットでバイナリ化されるため、他言語に渡すことが出来ない。 そこでXML。 なるほど、偉い人がオブジェクトの永続化はXMLを使うと良いといっていたのはこういう事だったのか!

サンプルプログラム

TECHSCORE - Java,SQLプログラミング技術解説 に良いサンプルプログラムがありました。 -> オブジェクトのシリアライズ 入出力 -TECHSCORE-


参考サイト
[fladdict.net blog: データのシリアライズ]

@IT:連載:.NETで簡単XML 第9回 オブジェクトをXMLでシリアライズ(1)



Wikipediaより引用

オブジェクト指向プログラミングにおいて使われる用語で、ある環境において存在しているオブジェクトを、バイト列に変換することをいう。より具体的には、そのオブジェクトの状態を表す変数(フィールド)と、場合によってはオブジェクトの種類(クラス)を表すなんらかの識別子を、ファイル化できるようなバイト列の形に書き出すことをいう。

投稿者 すなうさぎ : 09:41 | コメント (0) | トラックバック

2005年12月08日

List インターフェイスについてのメモ

java.util.Listインターフェイス

順序付けられた可変長のデータの集まり「リスト構造」を表現するためのインターフェイス。

ArrayListクラス

事実1 ArrayListクラスは、内部的に配列を使ってリスト構造を実装している。
事実2 要素を挿入/削除する場合インデックスの修正や配列サイズの変更のために配列のコピーを行うため、処理が重くなる。
事実3 インデックスが貼ってあるので、参照するのは高速である。
同期化されていない。

Vectorクラス

特徴はArrayListに同じ。 こちらは同期化されているため、マルチスレッドで呼び出しても大丈夫。

LinkedListクラス

事実1 データの要素を数珠つなぎに繋げていくことで、リスト構造を実装している。
事実2 要素の挿入・削除は、前後の要素のリンクを付け替えるだけで済む。
事実3 後ろの要素を参照すると要素をたどらないと要素をみれない。
同期化されていない。

参考サイト
@IT:Java TIPS Listインターフェイスの3つのクラスを理解する。
http://www.atmarkit.co.jp/fjava/javatips/136java026.html

投稿者 すなうさぎ : 00:01 | コメント (0) | トラックバック

2005年12月07日

Collection Frameworkについてのメモ

Javaのプログラムを触っていると、不思議と配列を宣言する機会が少ない。
代わりにArrayListというクラスを多用する。
どうやらこれは自分で配列を作らなくても、予めデータを扱うクラスが用意されているらしい。
調べてみるとListの他にもSetやMapというものがあって、これらはCollection Frameworkと呼ばれている。
それぞれの特徴は以下の通り。

List

要素の順序を保持し、同一要素の複数保持も可能。
実装クラス
ArrayList
Vector
LinkedList

Set

要素の順序を保持せず、同一要素は上書きされる。
実装クラス
HashSet
TreeSet
LinkedHashSet

Map

keyとvalueを組にすることで要素を保持。 要素の順序は保持せず、同一keyの要素は上書きされる。
実装クラス
HashMap
TreeMap
HashTable
HashSet
TreeSet
LinkedHashSet

投稿者 すなうさぎ : 14:37 | コメント (0) | トラックバック

2005年12月06日

JAVA プリミティブ型,参照型,enum型についてのメモ

プリミティブ型について

事実1 Javaでは変数を使う前には必ず宣言しないといけない。
事実2 変数の宣言を行うと、必要なサイズ文のメモリを確保する。
事実3 変数の中に何も入れずに呼び出すとnullぽ。
事実4 boolean,char,int,byte,long,float,double これらはプリミティブ型と呼ばれる。

プリミティブ型とはデータを格納するための最も基本的な型である。プリミティブ型は、CPUで直接メモリの内容を読み書きして計算させるという「プリミティブ」な用途で使われる。


参照型について

事実5 Javaでは、クラスという仕組みを使うことで、変数の組み合わせを1つの変数であるかのように扱えるようになる。
事実6 クラスに必要なメモリ領域を確保することを「インスタンス化」といいます。
事実7 メモリ内に存在するクラスの実体のことを「インスタンス」もしくは「オブジェクト」と呼ぶ。

参照型とは言語仕様で定義されていないものである。
宣言の例 List list = new List();

プリミティブ型と参照型の比較

プリミティブ型はサイズが決まっているので、メモリ上において先頭のアドレスさえわかれば、どこからどこまでがどの変数用のメモリなのか判断できる。


enum型


あるクラスの取りうる値を限定して、それらの限定した値しか使えないようにする機能。

参考サイト
@IT:いまから始めるJava
http://www.atmarkit.co.jp/fjava/rensai2/javaent01/javaent01.html

投稿者 すなうさぎ : 13:21 | コメント (0) | トラックバック

2005年11月01日

続 JavaBeans

以前の記事でJavaBeansは情報のカプセル化を行うクラスだという記事を書いたが、偉い人の話によると、ただ情報をまとめるだけにJavaBeansを作成するのはソフトウェアの保守性と可読性の観点からやってはいけないことらしい。

JavaBeansは業務ロジック単位で考え、JSPが扱う情報をまとめておくようにすることで保守性の向上見込まれる。

さて、今処理 Z を考えたときに必要なデータを ZBean にすることを考える。
まず、DAO (Data Access Object)に注目すると返値として XBean , YBean を持つメソッドはある。
ここで XBean , YBean から ZBean へデータ引き渡す事によってその場しのぎのバータリーな処理を行うことが出来るが、もし機能拡張や複雑な処理に変更しようとしたときにソースコードが少しずつ改悪されていくに違いない。
なぜなら仕様変更によって処理 X , 処理Yが更新された場合、処理Zに影響を及ぼしてしまうからである。
なので、 ZBeans は XBeans , YBeans と同じ情報が入ったとしても Beans から Beans の受け渡しを行ったりしないほうが保守性に優れる。
DAO においても同様のことがいえる。同じ情報が必要だからと行って、同じメソッドの使い回しを使い回すのではなく、業務ロジック単位で考えた方が保守性に優れるだろう。

可読性の低下についていえば、処理Zを行うためにXBeansとYBeansを展開したり、セッションを2つにすることによりソースコードを追いづらくなったり、そもそも必要な情報を2つの器(うつわ)から流し込むよりも、一つの器にまとまっている方が理解しやすいということか。

投稿者 すなうさぎ : 03:19 | コメント (0) | トラックバック

POJO

偉い人が POJO という単語を口にしていたので調べてみた。
正式名称 : Plain Old Java Object
Javabeansと同義(?)

答えっぽい記事みつけました。
英語ですが・・・・
http://martinfowler.com/bliki/POJO.html

内容は、ビジネスロジックをJavaオブジェクトに入れたほうが、Entity Bean を使うよりもメリットがたくさんあるらしい。
で、ビジネスロジックをいれたBeanをPOJOと呼ぼうじゃないか。
と、いう感じでしょうか。(逆かもしれません)


POJOがしめすアプリケーションの形
http://www.arclamp.jp/blog/archives/000474.html

引用
POJOを、もう少し詳しく定義するなら、「自分がするべきことに対して最低限しか知らないオブジェクト」、さらに「実行環境やフレームワークのことは一切知らないオブジェクト」といえるのではないか。

他のオブジェクトへの依存性を極力無くしてあげている。ということはモジュール強度が低い?
最近Beanのなかに違うクラスのBeanを突っ込んだりする作業をして気持ち悪さを感じているのだが、さてどうしたものか。
結局POJOはよくわかりませんでした。まだまだ精進が足りないようで・・・

投稿者 すなうさぎ : 02:35 | コメント (0) | トラックバック

2005年09月09日

JavaBeansとは

Java で Web アプリケーションを作成していると JavaBeans を使用する。
どうもこれは何かの属性をまとめて入れておく箱のように見える。

例えば、humanBean というものを作ればその中身は Name , age , sex など人の属性が一通り書かれている。

MVCモデルでコーディングを行ったとき、データベースからロジック、ロジックからビューにデータを運ぶのにとても役立ったのだが、素人目でソースファイルを見ると余りにもマヌケなことが書かれている。

private String name;

public String getName() {
return name;
}
public void setName() {
this.name = name;
}

プライベートで name が定義され、getName メソッドは name を戻り値として終了。setName メソッドは name を this.name に入れて終了。

マヌケなプログラムではあるが、実用性は非常に高い。
疑問なところが多かったのでリサーチしてみました。


Solti@Wiki -Java とバイクと男と男- - SJC-A のこと によりますと、

JavaBeans の setter/getter メソッド
大雑把に言えば属性(変数) を隠蔽して(private にして)、その値を設定する setter メソッドと値を取得する getter メソッドが公開(public 指定)されてる Java のクラス。変数を読み取り専用にしたければ、getter のみ用意して setter は作らなければ済む。

ということでした。

どうもデータのカプセル化を行っているようです。
ちなみにカプセル化に関しての説明も先のサイトに説明がありました。

投稿者 すなうさぎ : 04:28 | コメント (2) | トラックバック