我一直在读,空对象模式将帮助您避免空检查和空指针异常,使您的代码更清晰易懂。
我从未使用它,我发现它很有趣。 "空"不会占用内存但是如果我开始用"默认"的创建来替换我的空检查。对象,这个程序长期会对记忆产生负面影响吗?
前:
空对象模式
public void DoSomething()
{
User user = this.GetUser(id);
string strDisplayName = user.DisplayName;
}
public User GetUser(int id)
{
User user = this.LoadUserFromDB(id);
if(user == null)
return User.CreateNull();
return user;
}
因此,一旦我离开该方法的范围,该对象将在稍后由GC收集。 但是如果我在离开范围之前通过一个循环会怎样。
public void DoSomething()
{
users = this.GetAllUsers();
foreach(User user in users)
{
string strAddress = user.Address.StreetName;
//continue tasks
}
}
同时在其他课程中
public Class User
{
public Address Address
{
get
{
if(this.Address == null)
this.Address = Address.CreateNull();
return this.Address;
}
}
}
public class Address
{
private string streetName;
public virtual string StreetName
{
get { return this.streetName; }
set { this.streetName = value; }
}
public static CreateNull()
{
return new NullAddress();
}
}
public class NullAddress : Address
{
public override string StreetName
{
get { retun String.Empty; }
}
}
空检查
User user = this.GetUser(id);
string strDisplayName = String.Empty;
if(user != null)
{
strDisplayName = user.DisplayName;
}
只检查用户是否为空,因此请指定属性值。我不会创造一个" null"对象
提前致谢。
答案 0 :(得分:7)
通常,空对象不是按需创建的 - 而是共享它们。它们通常是一些其他抽象的不可变实现(使用无操作方法或任何适合的方法) - 因此可以非常容易地共享它们。
此时,在整个应用程序生命周期中,您感兴趣的每个null对象类型都有一个单个对象 - 这几乎肯定无关紧要。
答案 1 :(得分:1)
作为一个模式,空对象应该是平坦而纤细的,所以答案将不是大部分时间。但是你应该对通过契约支持序列化的null对象保持警惕,并且可能导致整个地方的重复。