Почему Фаулер PoEAA с. 498 определяют шаблон нулевого объекта следующим образом (образец сокращен, язык c #, но это не имеет значения):
public class Customer
{
public virtual string Name {get; set;}
}
public class NullCustomer : Customer, INull
{
public override Name
{
get { return "ImTheNull";}
// setter ommitted
}
}
INull
используется в качестве интерфейса маркера.
Мне не очень нравится этот подход по трем причинам:
- Свойства должны быть помечены как виртуальные
- Я больше не могу запечатать свои классы сущностей
- По крайней мере (n + 1) введены новые типы (n пустых объектов, один интерфейс маркера)
Почему это не реализовано так:
public class Customer
{
public static readonly Customer NullCustomer = new Customer(){Name = "ImtTheNullCustomer";}
public string Name {get; set;}
}
Я, как правило, нашел все примеры Фаулера хорошо продуманными, и, должно быть, я кое-что здесь упустил.