作成日 2008/6/15
最終更新日 2008/6/16

イミュータブルオブジェクト

 ここでは、オブジェクト指向プログラミングに関して、重要な割にはあまり知られていない概念であるイミュータブル(Immutable)オブジェクトについて説明します。

1.イミュータブルオブジェクトとは
2.イミュータブルオブジェクトの特徴
3.参考文献など


1.イミュータブルオブジェクトとは

 イミュータブルオブジェクトとはオブジェクトを生成した後、内部のデータが更新されないようになっているオブジェクトのことです。

 実際の例としてはJavaではjava.lang.String クラスが有名です。
 VBAでは、・・・知らないです。

 VBAで、イミュータブルオブジェクトを作成したい場合は以下のようにすればよいです。
  1. クラスモジュールを作成する(ここではクラス名はClass1とする)
  2. 以下のような感じでプログラムを作成する
    ポイント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

  3. オブジェクトを生成して初期化する
    Dim obj As Class1
    
    Set obj = New Class1
    Call obj.init(1, 2)
このページのトップへ

2.イミュータブルオブジェクトの特徴

  イミュータブルオブジェクトの特徴は以下の通りです。
  1. 一度オブジェクトを生成すると、フィールドを変更できない(特徴と言うか定義?) 。
  2. オブジェクトをコピーしたとき、シャローコピーであってもデータが不用意に変更されることが無い。
    オブジェクトをコピーしたとき、データが不用意に変更されないようにするにはシャローコピーをする必要がありますが、しかしディープコピーはシャローコピーよりも速度が遅いです。
  3. マルチスレッドプログラミングをする際、通常であれば、setterとgetterには排他制御が必要となってくるが、それが必要ない。
    まあ、そもそもVBAでマルチスレッドプログラミングができるのかだるまは良く知らないのですが、一般的には排他制御のソースを組む(※1)のは面倒くさいし、スピードが落ちます。
-----
※1:Javaならsynchronizedブロックやsynchronizedメソッド、C言語ならpthread_mutexを使うのが一般的だと思います。
排他制御はデッドロック に配慮しないといけないから面倒くさい。
このページのトップへ

3.参考文献など

 このページを作成するのに参考にしたページです。
 ただし、だるまが以下のページをちゃんと理解してこのページを作成したとは思わないように。

番号

リンク先の名称

リンク先の説明

リンクした日

1 イミュータブル - Wikipedia イミュータブルオブジェクトについて説明しています。 2008/6/15
2 イミュータブルオブジェクト イミュータブルオブジェクトについて、オブジェクトのコピーの問題、マルチスレッドにおける問題の観点から説明しています。 2008/6/15


Prev Up Next  Top
このページのトップへ

このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方はメールをお願いします。

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. の米国およびその他の国における商標または登録商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。

このホームページの作成者はこれらの会社とはいっさい関係がありません。