一个类可以返回自己的对象。
在我的示例中,我有一个名为“Change”的类,它代表对系统的更改,我想知道它是否反对设计原则来返回一个Change类型的对象或一个填充了所有的ArrayList最近更改对象。
答案 0 :(得分:5)
返回this
的另一个原因是你可以进行功能链接:
class foo
{
private int x;
public foo()
{
this.x = 0;
}
public foo Add(int a)
{
this.x += a;
return this;
}
public foo Subtract(int a)
{
this.x -= a;
return this;
}
public int Value
{
get { return this.x; }
}
public static void Main()
{
foo f = new foo();
f.Add(10).Add(20).Subtract(1);
System.Console.WriteLine(f.Value);
}
}
$ ./foo.exe 29
有时间和地点进行功能链接,并不是“随时随地”。但是,LINQ是非常从功能链中受益的地方的一个很好的例子。
答案 1 :(得分:4)
是的,它可以。事实上,这正是单身人士所做的。第一次调用其类级getInstance()
方法时,它会构造自身的实例并返回它。然后对getInstance()
的后续调用返回已经构造的实例。
您的特定情况可能使用类似的方法,但您需要某种方法来确定最近的更改列表。因此,它需要维护自己的此类更改列表。您可以使用静态数组或更改列表执行此操作。只要确定列表中的基础信息不会消失 - 如果你保持指向对象的指针并且客户释放了这些对象,那么这可能发生在C ++中(例如)。
自动垃圾收集环境(如Java)中的问题较少,因为在仍有引用的情况下,对象不会消失。
但是,您 不能使用此方法。我对你描述的内容的偏好是有两个分支,变更列表和变更。当您创建更改类的实例时,使用构造函数传递changelist对象(如果您不希望它与更改列表关联,则返回null),并在返回之前将更改添加到该列表。
或者,有一个changelist方法,它自己创建一个更改并返回它,为自己的目的记住更改。
然后,您可以查询更改列表以获取最近的更改(但是您定义了最近的更改)。这会更灵活,因为它允许多个列表。
如果需要,您甚至可以过度使用并允许更改与多个更改列表相关联。
答案 2 :(得分:4)
是的,一个类可以有一个返回自身实例的方法。这是一种非常常见的情况。
在C#中,一个例子可能是:
public class Change
{
public int ChangeID { get; set; }
private Change(int changeId)
{
ChangeID = changeId;
LoadFromDatabase();
}
private void LoadFromDatabase()
{
// TODO Perform Database load here.
}
public static Change GetChange(int changeId)
{
return new Change(changeId);
}
}
答案 3 :(得分:3)
类通常会从有时称为“工厂”方法的方式返回自身的实例。在Java或C ++(等)中,这通常是公共静态方法,例如你可以直接在类上调用它而不是在类的实例上调用它。
在您的情况下,在Java中,它可能看起来像这样:
List<Change> changes = Change.getRecentChanges();
这假设Change类本身知道如何跟踪更改本身,而不是该作业是系统中某些其他对象的责任。
类也可以在单例模式中返回自身的实例,您希望确保世界中只存在一个类的实例:
Foo foo = Foo.getInstance();
答案 4 :(得分:1)
流畅的接口方法适用于返回自身实例的原理,例如
StringBuilder sb = new StringBuilder("123");
sb.Append("456").Append("789");
答案 5 :(得分:1)
你需要考虑你想要建模的东西。在您的情况下,我将有一个包含一个或多个Change对象的ChangeList类。
另一方面,如果您正在建模一个层次结构,其中一个类可以引用该类的其他实例,那么您正在做的事情是有意义的。例如。树节点,可以包含其他树节点。
另一种常见的情况是让类实现一个返回它的实例的静态方法。在创建类的新实例时应该使用它。
答案 6 :(得分:0)
我不知道任何说不好的设计规则。因此,如果在您的模型中,单个更改可以由多个更改组成。