Nemerle for OOP Programmers Week 1 (3)
続きは明日,とかいいながらずいぶん時間が経ちました.
まぁ,のんびりといきましょう.
前回はNemerleでSingletonってどうするの?って話でした.こんなときはとりあえずC#で実装(^^;;
using System; namespace ConsoleApplication1 { class NameSingleton { static private string name; static public string Name { get { return name; } } static private NameSingleton singleton; static public NameSingleton GetInstance() { if (singleton == null) { singleton = new NameSingleton(); } return singleton; } private NameSingleton() { name = "kurip"; } } class Program { static void Main(string[] args) { NameSingleton singleton = NameSingleton.GetInstance(); Console.WriteLine("Hello, {0}", NameSingleton.Name); } } }
まぁ,このプログラム自体がどうなの?って話もありますが,問題はNameSingletonコンストラクタです.それ以外のメソッドは全てstaticだけどここだけインスタンスメソッドですね.Nemerleだとstaticメソッドからインスタンスメソッドを呼べないのでアウトですね.
さて,staticなコンストラクタって作れるんでしょうか?
……自分はこれまで知らなかった(というか,使ったことがないので忘れていた!)のですが,その名もstaticコンストラクタというものがあります.これを使うと
static NameSingleton() { name = "kurip"; }
と書けます(この場合アクセス修飾子を付けるとエラーになる).これを使うとして,GetInstanceメソッドとかは不要なので削除したりすると
namespace ConsoleApplication1 { class NameSingleton { static private string name; static public string Name { get { return name; } } static NameSingleton() { name = "kurip"; } } class Program { static void Main(string[] args) { Console.WriteLine("Hello, {0}", NameSingleton.Name); } } }
???
これって誰がみてもSingletonではないよなー.
Singletonはインスタンスがただ1つであることを保証するものであって,インスタンスを作れなくさせることとは違いますよね.
そう考えると,そもそもアプローチの仕方が間違っていたのかもしれないと気がつきました.
- インスタンスの生成は出来るようにする
- でもnewによる生成は出来ないようにする(複数生成されるのは避けたい)
- staticメソッドで生成させる
- でもstaticメソッドではnewによるインスタンス生成はできない
- staticコンストラクタは使える
- staticメソッドによるインスタンス生成は不要だから削除
- でもこれってSingleton?
- 最初にもどる
この無限ループのどこかに致命的なバグが含まれているようです.たぶん,もっと別のやり方で実現させるのでしょうね.とりあえず今は手持ちがないので,Nemerleに戻ろうと思います