1

До сих пор я видел везде, что шаги, чтобы создать Null шаблон объекта, например, в BST, чтобы удалить пустые чеки, являются следующие:Пути реализации Null План объекта

  1. Создание интерфейса Node

  2. Создайте два класса, реализующих интерфейс Node. Один из них будет real_Node, а другой будет null_Node.

  3. Используя эти классы, нулевые проверки могут быть удалены в классе BST при создании дерева.

Теперь я хочу знать, что есть и другие способы сделать это, например, Можно ли реализовать Null Object Pattern без интерфейса с использованием только классов, то есть в предыдущем шаге (1.) мы можем использовать узел class вместо интерфейса Node

+0

* «static classes» * Статический класс - это всего лишь тип вложенного класса, поэтому я не вижу, что он должен делать с шаблоном нулевого объекта. Измените свой вопрос и попробуйте уточнить, что вы просите. – Radiodef

+0

Спасибо, я хочу спросить, что в (1.) мы можем использовать Node-класс вместо интерфейса Node. – Nazgul

+2

Java 8+ включает контейнер типа ['Optional'] (https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html). –

ответ

2

Да, есть способы реализовать шаблон объекта Null без явного использования Java interface. Тем не менее, вы действительно делаете то же самое, что и YMMV. Вы можете найти проблемы, если у вас нет доступа к базовому классу и/или он не позволяет использовать какую-либо форму расширения/переопределения.

  • Создайте класс, который расширяет базовый класс, но который выполняет операции «null», переопределяя их. Вы бы обычно скрывали это за каким-то статическим конструктором для удобства доступа.

    class Base { 
        public void someMethod() { 
         // this stuff does the non-null behaviour 
        } 
    
        public static Base nullVersion() { 
         return new NullOfBase(); 
        } 
    
        private static class NullOfBase extends Base { 
         @Override 
         public void someMethod() { 
          // this guy does the null version. 
         } 
        } 
    } 
    
  • Используйте анонимный класс на статический член класса «NULL», который переопределяет различные операции, которые нужно переопределить.

    public class Base { 
        public static final Base NULL = new Base() { 
         @Override 
         public void someMethod() { 
          // this guy does the null version. 
         } 
        } 
    
        public void someMethod() { 
         // this stuff does the non-null behaviour 
        } 
    } 
    
  • Используйте абстрактный класс для проведения операций, которые являются общими для обоего непустых и нулевых реализаций, маркировка этих методов, как окончательные, все остальные методы являются абстрактными и реализуются в двух конкретных классах - один для ненулевую функциональность и другую для нулевой функциональности. Вы можете использовать статические конструкторы, чтобы упростить создание общих случаев использования и конкретные имена классов, скрытые от представления.

    public abstract class Base { 
        public final sayHello() { 
         System.out.println("Hello world"); 
        } 
    
        public abstract void someMethod(); 
    
        public static Base nonNullVersion() { 
         return new NonNullBase(); 
        } 
    
        public static Base nullVersion() { 
         return new NullBase(); 
        } 
    
        private static final class NonNullBase extends Base { 
         @Override 
         public void someMethod() { 
          // this stuff does the non-null behaviour 
         } 
        } 
    
        private static final class NullBase extends Base { 
         @Override 
         public void someMethod() { 
          // this stuff does the null behaviour 
         } 
        } 
    } 
    

В качестве альтернативы, иногда NULL-объект действительно только частный случай определенного значения (это зависит от того, какие операции на классе есть). В этом случае у вас может быть статический член с этим значением или статический завод, который позволяет вам его создать.

Смежные вопросы