Null对象模式是否占用内存

时间:2015-12-01 20:40:09

标签: java c# design-patterns null

我一直在读,空对象模式将帮助您避免空检查和空指针异常,使您的代码更清晰易懂。

我从未使用它,我发现它很有趣。 "空"不会占用内存但是如果我开始用"默认"的创建来替换我的空检查。对象,这个程序长期会对记忆产生负面影响吗?

前:

空对象模式

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"对象

提前致谢。

2 个答案:

答案 0 :(得分:7)

通常,空对象不是按需创建的 - 而是共享它们。它们通常是一些其他抽象的不可变实现(使用无操作方法或任何适合的方法) - 因此可以非常容易地共享它们。

此时,在整个应用程序生命周期中,您感兴趣的每个null对象类型都有一个单个对象 - 这几乎肯定无关紧要。

答案 1 :(得分:1)

作为一个模式,空对象应该是平坦而纤细的,所以答案将不是大部分时间。但是你应该对通过契约支持序列化的null对象保持警惕,并且可能导致整个地方的重复。