Perl と Moose を使用してシングルトン ロールを作成しようとしています。MooseX::Singleton モジュールが利用可能であることは理解していますが、私たちのプロジェクトに別の CPAN モジュールが必要な場合は常に抵抗があります。これを試して少し問題が発生した後、私の方法が機能しない理由を理解したいと思います。私が書いたシングルトンの役割は次のとおりです。
package Singleton;
use Moose::Role;
my $_singleInstance;
around 'new' => sub {
my $orig = shift;
my $class = shift;
if (not defined $_singleInstance ){
$_singleInstance = $class->$orig(@_);
}
return $_singleInstance;
};
sub getInstance
{
return __PACKAGE__->new();
}
1;
これは、シングルトン ロールを使用するクラスが 1 つだけの場合に機能するようです。ただし、2 つのクラス (ClassA と ClassB など) の両方が Singleton ロールを使用すると、両方が共有 $_singleInstance 変数を参照しているように見えます。ClassA->getInstance を呼び出すと、ClassA オブジェクトへの参照が返されます。同じスクリプトで後で ClassB->getInstance を呼び出すと、タイプ ClassA のオブジェクトへの参照が返されます (明らかに ClassB の getInstance メソッドを呼び出したにもかかわらず)。ロールを使用せず、Singleton ロールのコードを実際にコピーして ClassA と ClassB に貼り付けると、正常に動作するように見えます。何が起きてる?