El patrón de objeto nulo es un patrón de diseño que simplifica el uso de dependencias que pueden no estar definidas. Esto se logra mediante el uso de instancias de una clase concreta que implementa una interfaz conocida, en lugar de referencias nulas.
Creamos una clase abstracta que especifica varias operaciones a realizar, clases concretas que amplían esta clase y una clase de objeto nulo que proporciona una implementación inactiva de esta clase y se usará sin problemas cuando necesitemos verificar el valor nulo.
Diagrama UML para patrón de diseño de objeto nulo
Componentes de diseño
- Cliente: esta clase tiene una dependencia que puede o no ser necesaria. Cuando no se requiera funcionalidad en la dependencia, ejecutará los métodos de un objeto nulo.
- DependencyBase: esta clase abstracta es la clase base para las diversas dependencias disponibles que el Cliente puede usar. Esta es también la clase base para la clase de objeto nulo. Cuando la clase base no proporciona funcionalidad compartida, puede ser reemplazada por una interfaz.
- Dependencia: Esta clase es una dependencia funcional que puede ser utilizada por el Cliente.
- NullObject: Esta es la clase de objeto nulo que el Cliente puede usar como una dependencia. No contiene funcionalidad pero implementa todos los miembros definidos por la clase abstracta DependencyBase.
Veamos un ejemplo de patrón de diseño de objeto nulo.
// Java program to illustrate Null // Object Design Pattern abstract class Emp { protected String name; public abstract boolean isNull(); public abstract String getName(); } class Coder extends Emp { public Coder(String name) { this.name = name; } @Override public String getName() { return name; } @Override public boolean isNull() { return false; } } class NoClient extends Emp { @Override public String getName() { return "Not Available"; } @Override public boolean isNull() { return true; } } class EmpData { public static final String[] names = {"Lokesh", "Kushagra", "Vikram"}; public static Emp getClient(String name) { for (int i = 0; i < names.length; i++) { if (names[i].equalsIgnoreCase(name)) { return new Coder(name); } } return new NoClient(); } } public class Main { public static void main(String[] args) { Emp emp1 = EmpData.getClient("Lokesh"); Emp emp2 = EmpData.getClient("Kushagra"); Emp emp3 = EmpData.getClient("Vikram"); Emp emp4 = EmpData.getClient("Rishabh"); System.out.println(emp1.getName()); System.out.println(emp2.getName()); System.out.println(emp3.getName()); System.out.println(emp4.getName()); } }
Producción:
Lokesh Kushagra Vikram Not Available
ventajas :
- Define jerarquías de clases que consisten en objetos reales y objetos nulos. Los objetos nulos se pueden usar en lugar de objetos reales cuando se espera que el objeto no haga nada. Siempre que el código del cliente espera un objeto real, también puede tomar un objeto nulo.
- También simplifica el código del cliente. Los clientes pueden tratar a los colaboradores reales y a los colaboradores nulos de manera uniforme. Los clientes normalmente no saben si están tratando con un colaborador real o nulo. Esto simplifica el código del cliente, porque evita tener que escribir código de prueba que maneje especialmente al colaborador nulo.
Desventajas:
- Puede ser difícil de implementar si varios clientes no están de acuerdo en cómo el objeto nulo no debe hacer nada cuando su interfaz AbstractObject no está bien definida.
- Puede requerir la creación de una nueva clase NullObject para cada nueva clase AbstractObject.
Este artículo es una contribución de Saket Kumar . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA