`

代码中引入Null Object模式

阅读更多

在项目中的facade都需要对传入的参数进行相关的判断,或者对对象的进行判断,从人防止空指针的发生。

eg: public Book getBook(int id) { 
  if (id < 0) { 
        return null; 
    } 
    return new Book(1, "java编程思想", 65); 
}  

或者

List<Book> list =BookDao.getBook()

   if (null != list && list.isEmpty())
        {
            return mappings.get(0);
        }
       return null;

在调用的时候我们需要进行book对象的判断

if(null==book)

{

  ....

}else{....}

 

系统在使用对象的相关功能时,总要检查对象是否为null,如果不为null,我们才会调用它的相关方法,完成某种逻辑。这样的检查在一个系统中出现很多次,相信任何一个设计者都不愿意看到这样的情况。为了解决这种问题,我们可以可以引入空对象,这样,我们就可以摆脱大量程式化的代码,对代码的可读性也是一个飞跃。

 

 

方法1 : 采用的传统的方式但参数不合法时抛出相关的异常信息,那么上述例子可以为如下:

if (id < 0)

 

{
     throw new IllegalArgumentException("Invalidate id ");
}

 

那么在调用时无需判断返回的对象是否为空操作了。

 

方法2 : 我们可以采用apache 中的Validate类中的方法对参数进行校验,对对象进行为空判断等,上述的代码可以修改为

public Book getBook(int id) {  

    Validate.isTrue(BigDecimal.valueOf(id).compareTo(BigDecimal.ZERO) >0, "Invalidate id ");
    return new Book(1, "java Design Pattern", 100); 

 

那么在调用时无需判断返回的对象是否为空操作了,如果参数为-1不合法那么Exception in thread "main" java.lang.IllegalArgumentException: Invalidate id 等信息。

 

方式1和方式2的唯一区别在于方式2少了条件的判断语句,其大体的还是与第一种方式基本相同。

 

 

方法3:我们可以采用NullObject模式来解决该问题,具体实现如下:

 

a. 编写Nullable接口,该接口中包含了isNull方法。

public interface Nullable<T> {
 boolean isNull();
}

 

b.编写Nullbook实现实体类Book,并重写isNull方法。

 class NullBook extends Book {
  @Override
  public boolean isNull() {
   return true;
  }

}

 

 

c.修改Book实体类将其实现Nullable接口,并编写工厂方法返回book对象。

 

//该方法返回值为false

@Override
 public boolean isNull() {
  return false;
 }

 

//工厂方法,返回book对象

public static Book createNullBook() {
  return new NullBook();
 }

 

 

那么Bookservice中的方法可以修改如下:

public Book getBook(int id) {
         if (id < 0) {
   return Book.createNullBook();
  }

  return new Book(1, "java编程思想", 65);

 }

 

调用Bookservice的方法可以修改为:

BookService service = new BookService();
  Book book = service.getBook(-1);
  if (book.isNull()) {
   System.out.println("book not found!");
  } else {
   System.out.println("name:" + book.getName());
   System.out.println("price:" + book.getPrice());
  }

 

 方法3可能会出现一个问题:如果某系统中大量的实体对象都需要进行Null判断,那么如果对某个实体都添加一个NullXX的类,那么这样会导致大量的类产生,也会有一定的影响。

 

目前解决的方法是将NullXX类做为实体类的内部类,从而来减少类的个数,完成NullObject模式。 可以将Book修改为如下:

public class Book
{
 .....
 static class NullBook extends Book {
  @Override
  public boolean isNull() {
   return true;
  }
   .....

}
总结 :方法1和方法2适应于系统中对该对象判断为null的情况下出现的比较少,如果该对象为null判断出现的非常频繁,那么方法3应该是不错的选择。

0
1
分享到:
评论

相关推荐

    null移动端崩溃问题

    在移动应用开发中,"null移动端崩溃问题"是一个常见的挑战,尤其当应用程序处理来自后台服务或网络请求的数据时。在很多情况下,这些数据可能包含null值,如果前端代码没有适当地处理这种情况,就可能导致程序崩溃。...

    C#设计模式,单件模式,C#代码

    在资源包中的"02单例模式"文件中,你可能会找到上述不同实现方式的代码示例,通过学习和实践这些代码,你可以深入理解单例模式的工作原理及其在C#中的应用。同时,了解单例模式的优缺点也是必要的,比如它可能导致...

    二十三种设计模式【PDF版】

    1.设计模式更抽象,J2EE 是具体的产品代码,我们可以接触到,而设计模式在对每个应用时才会产生具体代码。 2.设计模式是比 J2EE 等框架软件更小的体系结构,J2EE 中许多具体程序都是应用设计模式来完成的,当你深入...

    Java代码中如何去掉烦人的“!=null”

    2. 对于非集合类型的返回,可以使用空对象模式(Null Object Pattern)。例如,如果有一个`Action`接口,当找不到匹配的动作时,`Parser`接口的`findAction`方法可以返回一个`DO_NOTHING`对象,该对象实现了`Action`...

    C#单件模式例子 内含C#编写源代码

    单件模式(Singleton Pattern)是设计模式中的一种结构型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在C#编程中,单例模式被广泛应用于那些需要频繁创建和销毁的对象,比如线程池、数据库...

    设计模式-空对象模式

    它引入了一个“占位符”对象,即空对象(Null Object),这个对象的行为与真实对象相似,但不会引发错误或异常。当真实对象不存在时,空对象可以无缝地接替其职责,提供一种默认或无操作的行为。 在实现空对象模式...

    重构与模式.[美]Joshua Kerievsky(带详细书签).pdf

    9.3 引入Null Object 243 9.3.1 动机 244 9.3.2 做法 245 9.3.3 示例 246 第10章 聚集操作 251 10.1 将聚集操作搬移到Collecting Parameter 252 10.1.1 动机 252 10.1.2 做法 253 10.1.3 示例 254 10.2 将...

    1本关于遗留代码改进的书。

    在改进过程中,费瑟斯强调了逐步引入新接口的重要性,即一次只增加一个方法,并且提倡使用零对象(Null Object)和空对象模式来简化对象生命周期的管理。他还提到了GUT测试和库的问题,并指出模块化可以简化测试过程...

    (行为型模式) Iterator 迭代器模式

    而通过引入迭代器模式,我们可以在不改变客户端代码的情况下,轻松地处理不同类型的集合对象。 ##### 示例代码 ```csharp // 定义一个抽象的聚合类 public abstract class Aggregate { public abstract Iterator ...

    Javascript 设计模式之构造函数模式.zip

    JavaScript设计模式是编程实践中一种优秀的代码组织方式,它总结了在特定场景下解决常见问题的最佳实践。构造函数模式是JavaScript中的一种重要设计模式,用于创建对象。本文将深入探讨构造函数模式及其应用。 构造...

    精通C#(第6版)源代码

    本资源包含该书的源代码,旨在帮助读者更好地理解和实践书中的示例,提升编程技能。 在C#的学习过程中,源代码是至关重要的,它能让我们直观地看到程序的结构和工作方式。C#第6版引入了许多新的特性,如自动属性...

    空对象模式

    具体来说,在空对象模式中,我们通常会定义一个抽象基类,这个基类中包含了所有子类都需要实现的方法。然后,我们会创建一个或多个实体类(Real Objects),这些实体类继承自抽象基类,并实现了其中定义的方法。同时...

    设计模式.docx

    #### 空对象模式(Null Object Pattern) 空对象模式是用于解决 null 对象的问题。通过引入一个空对象来代替空引用,使得程序不会因为引用为空而抛出异常。 #### 策略模式(Strategy Pattern) 策略模式定义了一...

    C#23设计模式

    在这里,我们将详细探讨创建型模式中的一个基础且重要的模式——单件模式(Singleton Pattern)。 单件模式的主要动机是确保在一个系统中,某个类只有一个实例,并提供全局访问点。这种模式在系统配置、数据库连接...

    23种设计模式之C#版本.pdf

    在本文中,将详细探讨23种设计模式中的两种——单件模式(Singleton Pattern)和抽象工厂模式(Abstract Factory Pattern),并以C#语言为例来阐述其在实际开发中的应用和实现。 ### 单件模式(Singleton Pattern)...

    重构36计.docx

    NULL Object模式提供一个“空”对象,替代null值,简化代码中的null检查。 ### 函数命名有语法 遵循一致的命名规范,使函数名能反映其功能,提高代码可读性。 ### 去除只是内部状态不同的派生类 如果派生类只有...

    C#面向对象设计模式纵横谈(2)Singleton 单件(创建型模式)

    面向对象设计模式是软件开发中的重要工具,它们提供了一种标准化的方法来解决常见的设计问题,使得代码更加可读、可维护。在C#编程中,设计模式的应用尤为广泛,其中"Singleton"(单例)模式是一种创建型设计模式,...

Global site tag (gtag.js) - Google Analytics