Ich versuche, eine Singleton-Rolle mit Perl und Moose zu schreiben. Ich verstehe, dass ein MooseX :: Singleton-Modul verfügbar ist, aber es gibt immer Widerstand, wenn ein anderes CPAN-Modul für unser Projekt benötigt wird. Nachdem ich das versucht habe und ein paar Probleme habe, möchte ich verstehen, warum meine Methode nicht funktioniert. Die Singleton-Rolle, die ich geschrieben habe, ist wie folgt:Singleton Rollen in Moose
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;
Dies scheint finden zu arbeiten, wenn nur eine Klasse die Singleton Rolle verwendet. Wenn jedoch zwei Klassen (z. B. ClassA und ClassB) beide die Singleton-Rolle verwenden, werden beide auf eine gemeinsam genutzte Variable $ _singleInstance verwiesen. Wenn ich ClassA-> getInstance aufruft, gibt es einen Verweis auf ein ClassA-Objekt zurück. Wenn ich ClassB-> getInstance irgendwann später im selben Skript aufruft, gibt es einen Verweis auf ein Objekt vom Typ ClassA zurück (obwohl ich die getInstance-Methode für ClassB eindeutig aufgerufen habe). Wenn ich keine Rolle verwende und den Code aus der Singleton-Rolle tatsächlich in ClassA und ClassB kopiere und einfüge, scheint es zu funktionieren. Was ist denn hier los?
Sie erkennen, dass das Einpacken 'neu' nur nach einer Welt der Verletzung fragt, richtig? – Ether