在同一个类的方法中创建类的实例是否合理?
我问及"合理性"而不是"可行性"因为我可以写一个工作的例子,如下:
package MyPkg;
sub new {
...
}
sub myMethod {
my ($class, $param) = @_;
my $obj = $class->new();
...
}
,用法是:
use MyPkg;
my $result = MyPkg->myMethod("abc");
这个体系结构确实按预期工作(在$result
我得到了myMethod
对"瞬态"对象的调用的结果,并且调用者甚至不被强迫显式实例化一个新对象,然后用它来调用它的方法。
虽然,我觉得这不是" Perl-ish",我的意思是......我不喜欢它。我觉得这种方法存在缺陷,但无法确定原因。
是否有更多的标准'溶液
答案 0 :(得分:2)
是的,你可以这样做。这是quite widely done。
答案 1 :(得分:2)
没有什么要求构造函数具有名称new
,这只是惯例。您的myMethod
子名称可能有不同的名称,但它也是构造函数。
其中一个例子是XML::LibXML
。它有一个标准的构造函数,还有另外两个具有特定用途的构造函数:
use XML::LibXML '1.70';
# Parser constructor
$parser = XML::LibXML->new();
$parser = XML::LibXML->new(option=>value, ...);
$parser = XML::LibXML->new({option=>value, ...});
# Parsing XML
$dom = XML::LibXML->load_xml(
location => $file_or_url
# parser options ...
);
# Parsing HTML
$dom = XML::LibXML->load_html(...);
后两个可能是new
的包装器,但它们也是构造函数。
此外,一些对象被设计为不可变的。如果它们仍然允许对它们执行操作,则它们将需要返回相同类型的新对象。
所有这一切都是说,是的,你做的很好。