技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

java

java:並行開発を行うためのテクニック

何も考えずにクラス分割を行いクラス毎に開発者を割り当てると、未完成のクラスを取り込むことができず、他のクラスが完成するのを待つ必要が出てきてしまいます。今回は、他のクラスが完成するのを待たずに並行開発するテクニックを、javaの例を用いて説明…

java:WEBからHTMLファイルを取得するサンプルプログラム

行きつけのサイトのログ(HTMLファイル)を定期的に取得しているのですが、その時に使用しているサンプルプログラムを公開します。Javaの実行環境が整っているWindowsOSで、LogGet.java と LogGet.bat を同じディレクトリに置き、LogGet.bat を実行すると、…

クラス図とjavaソースの対応一覧

クラス図とはUMLの一種で、以下のような形でクラスの定義と各クラスの関係を表す設計図のことです。 今回は、クラス図で使われる記法とjavaソースの対応について、一覧にしてみました。参考になれば幸いです。 【クラス定義】 【各クラスの関係】

javaでのCommandパターン

Commandパターンとはデザインパターンの一種で、1つ1つのコマンド(命令)をそのままオブジェクトとして表現するパターンです。コマンドをオブジェクトとして表現することで、コマンドの管理(追加・削除・実行)が可能になるというメリットがあります。 …

javaでのStateパターン

Stateパターンとはデザインパターンの一種で、1つ1つの状態をそのままクラスとして表現するパターンです。通常のコーディングだとIF文で状態毎の処理を記述させるためそれぞれの状態でどのような処理が行われるのか読み取りにくいのですが、このパターンを…

javaでのMediatorパターン

Mediatorパターンはデザインパターンの一つで、複雑に絡み合ったオブジェクト間の関係をMediator(調停者)が整理するパターンです。例えば、10個のオブジェクト間で連携を取る必要がある場合、オブジェクト同士で直接連携を取ると、「自分以外の9個のオブ…

javaでのChainOfResponsibilityパターン

Chain of Responsibilityパターンとは、その名の通り責任が連鎖する構造を表すためのパターンです。あるオブジェクトで解決できない問題を別のオブジェクトにたらい回すようにするのがツボで、そうすることで解決できなかった場合の処理を簡略化できます。 …

javaでのVisitorパターン

Visitorパターンは、Compositeパターンを派生させたパターンであり、入れ物・中身の構造に対して複数の処理を記述する必要がある時に適用します。Entryクラスとは別にVisitorクラスを作成し、Visitorクラスの方に処理を記述することで、構造と処理を分けるこ…

javaでのDecoratorパターン

Decoratorパターンは、その名の通りオブジェクトに次々とデコレート(飾りつけ)をし、機能を追加していくパターンです。Compositeパターンと同じように再帰的なクラス構成とすることで、冗長性を排除します。 今回は、じゃんけんの手を作成するサンプルコー…

javaでのCompositeパターン

Compositeパターンは、入れ物のクラスと中身のクラスを1つの抽象クラスでまとめ、同一視できるようにするパターンです。このパターンを取り入れることで、クラスを使う側から見て入れ物のクラスなのか中身のクラスなのかを意識する必要がなくなります。 フ…

javaでのBridgeパターン

Bridgeパターンは、機能のクラス階層と実装のクラス階層を橋渡しするパターンです。機能のクラス階層と実装のクラス階層を分けることで、実装毎に機能を書かなくて良くなりますし、その逆に機能毎に実装を書かなくて良くなります。結果として、重複した記述…

javaでのBuilderパターン

Builderパターンは、処理内容を定義するBuilderクラスと、処理順番を定義するDirectorクラスの2つに分けることで、柔軟に処理を変更できるようにするパターンです。Builderクラスの定義により処理内容が変わっても都度処理内容を記述する必要が無くなり、Di…

java:Enumによりコード値に意味を持たせ可読性を向上させる

javaのEnum(列挙型)を使用するメリットとしては、一般的に「使用可能な定数を明確化できる」「定数を複数のクラスで使い回せる」といったメリットが挙げられます。実際に使用していて、コード値に意味を持たせられるというメリットもありそうだったので、…

javaでのAbstract Factoryパターン

Abstract FactoryパターンはFactory Methodパターンを発展させたもので、生成するオブジェクトの組み合わせを間違えないために、1つのFactoryクラスに複数のオブジェクトの生成処理を実装するようにしたものです。 今回は、RPGのキャラクター作成を模したサ…

javaでのFactory Methodパターン

Factory MethodパターンはTemplate Methodパターンをオブジェクト生成の場面に適用したもので、オブジェクト生成の処理を共通化することができます。 今回は、RPGのキャラクター作成を模したサンプルコードを作成してみました。キャラクターの職業毎にクラス…

javaでのTemplate Methodパターン

Template Methodパターンは、処理(メソッド)の中で共通している箇所を抽象クラスとして抜き出すことで、重複した記述を排除し、更に処理の流れも規定する手法のことを指します。手続き型言語でも共通する箇所を子メソッドとして抜き出すことをしますが、子…

javaでのFacadeパターン

Facadeクラスとは、使い方が複雑になっているクラス群をまとめ、使いやすい形のインターフェースとして外部に提供するクラスのことを指します。デザインパターンでは、このFacadeクラスを利用するパターンをFacadeパターンと呼びます。(ちなみに、Facadeは…

javaでのスレッド制御(joinとsynchronized)

javaでは、スレッドを立てて処理を並列に行うことができます。しかし、並列に処理を行う際、処理順を制御しなければならないことがあります。 処理順の制御方法として基本的な方法として、joinを使う方法とsynchronizedを使う方法があります。joinを使うこと…

javaでのソケット通信の記事引用

javaでは、C言語と同じようにIPアドレスとポート番号を指定してのサーバ間ソケット通信が可能です。既に解説やサンプルプログラムが充実していたので、当記事では引用のみ行います。 ・解説(図解)ストリーム型通信 http://ecogis.sfc.keio.ac.jp/online/ja…

singletonとstaticの違い

デザインパターンのsingletonパターンを学んだ時に「インスタンスを1個にすれば良いなら、クラス変数やメソッドをstaticにすれば良いのでは?」と思ったので、試しにテストコードを書いてみました。単純なstaticでは利用者側で好きにインスタンスを作成でき…

「不可視です」というエラーが出たらカプセル化された変数・メソッドを使用しようとしていないか疑う

タイトルの通りなのですが。 例えば、「int hoge = new java.util.Random().next(10)」というコードを書いた場合、「next(int)はRandomで不可視です」というエラーが出ます。 Randomクラスのnextメソッドはprotectedで定義されており、外部に提供されていな…

java:イミュータブルなクラスを作る方法

「イミュータブル」とは「不変」という意味で、オブジェクト指向の世界では「状態(クラス変数)がオブジェクト生成時から変更されないこと」を指します。有名所では、Stringがイミュータブルなクラスとして知られています。 イミュータブルなクラスを自作す…

java8:関数型インターフェースの背景にある考え方

【前置き】Java8から関数型インターフェースが使用可能になりました。具体的に「ラムダ式」「Stream」「Optional」「Files」と言った方がわかりやすいでしょうか。 関数型インターフェースは関数型プログラミングをサポートするものであるため、従来からJava…

java:ミュータブルな参照型変数の初期化の注意点

ミュータブルな参照型変数を初期化する場合、初期化の方法を間違えると他の変数も一緒に初期化してしまいます。この記事では、ミュータブルな参照型変数の初期化方法を解説します。 【基本データ型変数と参照型変数】変数は大きく分けて、基本データ型変数(…

java:他環境向けのファイルを出力する(文字コード・改行コード指定)

javaは実行環境に応じてデフォルトの文字コード・改行コードでファイルを出力するようにコーディングすることができます。そのことにより、実行環境毎でコーディングを変更せずとも、実行環境に合わせた文字コード・改行コードを採用することができます。 し…

java:インターフェースを用いることでクラス毎の重複した記述を無くす

javaにはインターフェースという機能があります。インターフェースとは、メソッドの仕様(メソッド名、戻り値、引数)のみを定義したものです。インターフェース単独では処理を実行できませんが、そのインターフェースを実装したクラスを定義することで処理…

java:プリミティブ型とラッパークラスの暗黙の型変換

最近知ったのですが、intやcharに代表されるプリミティブ型と、IntegerやCharacterに代用されるラッパークラスの間では暗黙の型変換が行われるそうです。プリミティブ型からラッパークラスへの暗黙の型変換をオートボクシング、ラッパークラスからプリミティ…

java:暗黙の型変換による意図しない小数点以下切り捨て

原因がわかるまでに手間取ってしまったので、記録として残しておきます。double型やBigDecimal型の変数の初期値を分数(例:2/3)で定義する際、小数点を入れないと「int型変数/int型変数」と判断されてしまい、小数点以下が切り捨てられた状態で変数に格納…

java:Hashmapで1つのキーで複数の値を結びつける方法

HashMapとは、「キー、値」の組み合わせでデータを保持することができるクラスのことです。このクラスを用いれば、キーに紐づく値を検索することが可能になります。 しかし、キーに対応する値が複数の場合は、一工夫する必要があります。私が趣味で作ってい…

java:Windowsバッチからの呼び出しで対話式で実行できることの確認

まあできますよね、という確認です。これができるなら、ちょっとしたツールを作成する時に幅が広がります。 【ソース】javaソースとWindowsバッチは同一フォルダに配置する。 ・javaソース(IOTest.java)import java.util.Scanner; public class IOTest { p…