作成日 2008/6/15
最終更新日 2008/6/16
イミュータブルオブジェクト
ここでは、オブジェクト指向プログラミングに関して、重要な割にはあまり知られていない概念であるイミュータブル(Immutable)オブジェクトについて説明します。
イミュータブルオブジェクトとはオブジェクトを生成した後、内部のデータが更新されないようになっているオブジェクトのことです。
実際の例としてはJavaではjava.lang.String
クラスが有名です。
VBAでは、・・・知らないです。
VBAで、イミュータブルオブジェクトを作成したい場合は以下のようにすればよいです。
- クラスモジュールを作成する(ここではクラス名はClass1とする)
- 以下のような感じでプログラムを作成する
ポイント1:VBAはコンストラクタ(Class_Initializeメソッド)に引数を持たせられないので、別途init関数を作成する
ポイント2:init関数は一度しか呼び出せないようにしておく
Option Explicit
'初期化済みかを保持するフィールド
Private m_isInited As Boolean
Private m_data1 As Integer
Private m_data2 As Long
':
Private Sub Class_Initialize()
m_isInited = False
m_data1 = 0
m_data2 = 0
End Sub
'フィールドを初期化する
'2回呼び出したときはエラー(エラー番号:425)が発生します
Public Sub init(ByVal data1 As Integer, ByVal data2 As Long)
If m_isInited Then
Call Err.Raise(425)
End If
m_data1 = data1
m_data2 = data2
m_isInited = True
End Sub
Public Property Get data1() As Integer
data1 = m_data1
End Property
Public Property Get data2() As Long
data2 = m_data2
End Property
|
- オブジェクトを生成して初期化する
Dim obj As Class1
Set obj = New Class1
Call obj.init(1, 2)
|
イミュータブルオブジェクトの特徴は以下の通りです。
- 一度オブジェクトを生成すると、フィールドを変更できない(特徴と言うか定義?) 。
- オブジェクトをコピーしたとき、シャローコピーであってもデータが不用意に変更されることが無い。
オブジェクトをコピーしたとき、データが不用意に変更されないようにするにはシャローコピーをする必要がありますが、しかしディープコピーはシャローコピーよりも速度が遅いです。
- マルチスレッドプログラミングをする際、通常であれば、setterとgetterには排他制御が必要となってくるが、それが必要ない。
まあ、そもそもVBAでマルチスレッドプログラミングができるのかだるまは良く知らないのですが、一般的には排他制御のソースを組む(※1)のは面倒くさいし、スピードが落ちます。
-----
※1:Javaならsynchronizedブロックやsynchronizedメソッド、C言語なら
pthread_mutexを使うのが一般的だと思います。
排他制御は
デッドロック
に配慮しないといけないから面倒くさい。
このページを作成するのに参考にしたページです。
ただし、だるまが以下のページをちゃんと理解してこのページを作成したとは思わないように。
番号 |
リンク先の名称 |
リンク先の説明 |
リンクした日 |
1 |
イミュータブル - Wikipedia |
イミュータブルオブジェクトについて説明しています。 |
2008/6/15 |
2 |
イミュータブルオブジェクト |
イミュータブルオブジェクトについて、オブジェクトのコピーの問題、マルチスレッドにおける問題の観点から説明しています。 |
2008/6/15 |
このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方は
メールをお願いします。
Microsoft 、Windows 、Visual Basic および Excel は米国Microsoft
Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
Mac 、Mac OS
、Mac OS
X は米国Apple
Computer,Inc.の登録商標または商標です。
Sun、Sun Microsystems、サンのロゴマーク、Java、及び、Sun/Solaris/Java に関連するすべての商標およびロゴマークは米国 Sun Microsystems, Inc. の米国およびその他の国における商標または登録商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。
このホームページの作成者はこれらの会社とはいっさい関係がありません。