假设我有以下 Moose 包:
package GSM::Cell;
use Moose;
has 'ID' => (is => 'ro', required => 1);
has [qw(BCCH NEIGHBOUR)] => (is => 'rw', default => undef);
no Moose;
__PACKAGE__->meta->make_immutable;
1;
然后我创建两个对象并将一个添加为另一个的“NEIGHBOUR”属性:
my $a = GSM::Cell->new(ID => 20021, BCCH => 1);
my $b = GSM::Cell->new(ID => 20022, BCCH => 2);
$a->NEIGHBOUR($b);
在其他地方,例如在另一个过程中,$b 的 BCCH 属性可以更新为另一个值:
$b->BCCH(3);
现在,如果我指
$a->NEIGHBOUR->BCCH
那么我仍然会取回 BCCH 属性的初始值,而不是更新后的值。
我想明智的做法是添加对 $b 而不是 $b 本身的引用,这将解决问题:
$a->NEIGHBOUR(\$b);
但是,我在 Web 应用程序中有这样的场景,其中一个等效于 $b(相同 ID)的对象在多种方法中被实例化,并且可以在任何一种方法中进行更改,这使得传递所有创建对象的引用变得困难。
理想情况下,当调用
my $somevar = GSM::Cell->new(ID => 20022);
制作完成后,只有在不存在具有相同 ID 的对象时才应创建对象。
是一本字典要走的路,像这样:
$id = 20022;
my $somevar = $already_created{$id} || GSM::Cell->new(ID => $id);
还是有更整洁的解决方案?