java:オブジェクトの中身をコピーする方法(cloneメソッド実装)

参照型変数(主に、自分で作成したクラスのオブジェクト)をコピーする場合、単純に「=」で代入するだけでは不十分な場合があります。
参照型変数の中身は参照先(オブジェクトのメモリ領域を示すポインタ)です。
「=」で代入するだけでは、参照先だけがコピーされて、参照しているものは同じという状態になるので、コピー先の変更がコピー元に影響してしまいますし、その逆にコピー元の変更がコピー先に影響してしまいます。

これを避けたい場合は、cloneメソッドを用いて中身を丸ごとコピー(新たにメモリ領域を確保し書き込み)する必要があります。
以下の記述を行うことで、cloneメソッドを使用することができるようになります。

・cloneしたいクラスでCloneableインターフェースを実装する

・Cloneableインターフェースのclone()メソッドをオーバーライドする

・clone()メソッド内で、super.clone()メソッドを使用する

 (super=Objectクラス)

・super.clone()メソッドはObject型で返ってくるので自身の型でキャストを行う

・CloneNotSupportedExceptionが返ってくる可能性があるので例外処理する

以下、サンプルコードです。
参照先のみコピーした場合とcloneで中身をコピーした場合を比較しています。
参照先のみコピーした場合は、コピー後にコピー先を変更した際にコピー元が影響を受けていますが、cloneで中身をコピーした場合は影響を受けていません。

【サンプルコード】

・CloneableItem.java

・ItemCloneMain.java

【実行結果】


いかがでしたでしょうか。

javaでオブジェクトの中身をコピーしようとした場合、言語仕様上の問題により意外と複雑な実装になってしまいます。
そのため、サンプルコードを参考に実装するのがお勧めです。
Webには他の方が書いてくださったサンプルコードが色々とあるので、用途に応じて他のサンプルコードも参考にしてみると良いでしょう。

今回の記事がお役に立てれば幸いです。
これからもjavaに関する記事を書いていこうと思います!

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

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

コーディングをしていると、コード値を用いた方が便利な場合が間々あります。
例えば、RPGの道具に対して、「weakSwordにはID0、normalSwordにはID1、strongSwordにはID2を割り振る」といった具合です。
コード値を用いれば、コード値を用いて配列操作することが可能になりますし、DBでマスタ管理する際にも便利です。

しかし、コード値には「人間が理解し辛い」というデメリットがあります。
コンピュータで処理する分には効率が良いのですが、人間から見たら「IDが0ならweakSword、IDが1なら…」といった具合で、コード値が何を意味しているのかを予め知る必要が出てきてしまいます。
コード値とその意味の対応付けを人間が行うことで、読み間違い・書き間違いといったバグに繋がるミスも起こりやすくなります。

そこで、Enumでコード値とその意味の対応付けを行えば、「ソースコード上は意味のある単語、コンピュータ上はコード値」という形にできます。
そうすることで、コード値とその意味の対応付けを人間が行う必要が無くなり、読み間違い・書き間違いを未然に防ぐことができます。

以下、サンプルコードです。

【サンプルコード】

・ItemEnum.java

・ItemManagementMain.java

【実行結果】


いかがでしたでしょうか。

Enumを始めて知った時は何のために使うのか分からなかったのですが、慣れてくると便利だと思うようになりました。
今回は、実際に使って便利だった点を一つ挙げて記事にしてみました。

これからも、役に立つと思ったことがあればどんどん記事にしていきたいと思います!

javaでのAbstract Factoryパターン

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

今回は、RPGのキャラクター作成を模したサンプルコードを作成してみました。
キャラクターの職業毎に、職業を示すオブジェクトとスキルを示すオブジェクトを生成します。
両オブジェクトの組み合わせ方を間違えないように、Abstract Factoryパターンにより組み合わせ方を限定しています。

【サンプルコード】

・AbstractJob.java

・WarriorJob.java

・MagicianJob.java

・AbstractSkill.java

・WarriorSkill.java

・MagicianSkill.java

・AbstractJobFactory.java

・WarriorFactory.java

・MagicianFactory.java

・CreateJobMain.java

【実行結果】


いかがでしたでしょうか?

デザインパターンの勉強をしていて、個人的に一番わかりにくいと思ったのは今回紹介したAbstract Factoryパターンです。
このデザインパターンは「複数のオブジェクトを組み合わせる場合に、その組み合わせ方を間違えないようにする」という意図を持ったデザインパターンなのですが、「Abstract Factory(抽象的な工場)」という名前からこの意図を読み取るのは難しいと思いますし、クラス図やサンプルコードを眺めても複雑で意図を理解するのは難しいと思います。
今回の記事で、その意図が伝われば幸いです。

まだ紹介していないデザインパターンもありますので、これからも少しずつ紹介していきたいと思います!

エクスプローラ上でフォルダを任意の順番で並べる

エクスプローラ上でフォルダを任意の順番で並べたい場合、多くの場合は「00_…」「01_…」のような形で番号を割り振り、名前で並び替えると思います。
しかし、フォルダに番号を振らずに作業を進め、既に数多くのリンクが貼られてしまったような状況では、番号を振り直すのが難しくなります。

その場合、更新日時を任意の順番にし、更新日時で並び替えるようにすると良いです。
更新日時を任意の順番にするには、Windows PowerShell を使って自動的で更新日時を更新できるようにすると良いです。
(更新日時が更新されてしまった場合は Windows PowerShell のスクリプトを実行することで更新日時を元に戻す必要は出てきてしまいますが、そこまで面倒ではないと思います)

例えば、以下のようなフォルダ構成になっていて、「hoge」→「fuga」→「piyo」の名前に並び替えたい場合

以下のようなバッチを用意して実行します。

・FolderSort.bat

・FolderSort.ps1


「FolderSort.bat」をダブルクリックして実行すると更新日時が「hoge」→「fuga」→「piyo」の順番になるように更新され、更新日時で並び替えることで「hoge」→「fuga」→「piyo」の順番になります。


あけましておめでとうございます!

今回は新年ということで、ちょっと軽めというか、小ネタを投稿してみました。
Web検索で良く出てくるのはレジストリを変更する方法とフリーソフトを使用する方法ですが、前者は変更をミスした場合のリスクが大きいですし、後者はセキュリティ上のリスク等が出てしまいます。現場のポリシー次第ではどちらもできないこともあります。
そこで、今回は、更新日時を利用する方法を紹介してみました。
もしお役に立てれば幸いです!