---
title: "Introducir objeto nulo"
type: "refactoring-technique"
slug: "introduce-null-object"
url: "http://localhost:3000/es/introduce-null-object.md"
category: "Simplifying Conditional Expressions"
description: "Problema: Como algunos métodos devuelven null en lugar de objetos reales, tienes muchas comprobaciones de null en tu código. Solución: En lugar de null, devuelve un objeto nulo que muestre el comportamiento por defecto."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Introducir objeto nulo

> Problema: Como algunos métodos devuelven null en lugar de objetos reales, tienes muchas comprobaciones de null en tu código. Solución: En lugar de null, devuelve un objeto nulo que muestre el comportamiento por defecto.

## Problem

Como algunos métodos devuelven `null` en lugar de objetos reales, tienes muchas comprobaciones de `null` en tu código.

## Solution

En lugar de `null`, devuelve un objeto nulo que muestre el comportamiento por defecto.

## Why Refactor

Docenas de comprobaciones de `null` hacen que tu código sea más largo y feo.

## How to Refactor

1. A partir de la clase en cuestión, crea una subclase que desempeñará el papel de objeto nulo.
2. En ambas clases, crea el método `isNull()`, que devolverá `true` para un objeto nulo y `false` para una clase real.
3. Encuentra todos los lugares donde el código pueda devolver `null` en lugar de un objeto real. Cambia el código para que devuelva un objeto nulo.
4. Encuentra todos los lugares donde las variables de la clase real se comparan con `null`. Reemplaza estas comprobaciones por una llamada a `isNull()`.
5. * Si en estos condicionales se ejecutan métodos de la clase original cuando un valor no es igual a `null`, redefine estos métodos en la clase nula e inserta ahí el código de la parte `else` de la condición. Entonces podrás eliminar todo el condicional y el comportamiento diferente se implementará mediante polimorfismo.
  * Si las cosas no son tan sencillas y los métodos no pueden redefinirse, comprueba si puedes simplemente extraer a nuevos métodos del objeto nulo las operaciones que debían realizarse en el caso de un valor `null`. Llama a estos métodos en lugar del código antiguo en `else` como las operaciones por defecto.
## Relations

**Similar techniques**

- [Reemplazar condicional con polimorfismo](/es/replace-conditional-with-polymorphism.md)

**Eliminates smells**

- [Sentencias switch](/es/smells/switch-statements.md)
- [Campo temporal](/es/smells/temporary-field.md)

## Code Examples

### java

```java
// Before
if (customer == null) {
  plan = BillingPlan.basic();
}
else {
  plan = customer.getPlan();
}

// After
class NullCustomer extends Customer {
  boolean isNull() {
    return true;
  }
  Plan getPlan() {
    return new NullPlan();
  }
  // Otra funcionalidad NULL.
}

// Reemplaza los valores null por el objeto nulo.
customer = (order.customer != null) ?
  order.customer : new NullCustomer();

// Usa el objeto nulo como si fuera una subclase normal.
plan = customer.getPlan();
```

### csharp

```csharp
// Before
if (customer == null) 
{
  plan = BillingPlan.Basic();
}
else 
{
  plan = customer.GetPlan();
}

// After
public sealed class NullCustomer: Customer 
{
  public override bool IsNull 
  {
    get { return true; }
  }
  
  public override Plan GetPlan() 
  {
    return new NullPlan();
  }
  // Otra funcionalidad NULL.
}

// Reemplaza los valores null por el objeto nulo.
customer = order.customer ?? new NullCustomer();

// Usa el objeto nulo como si fuera una subclase normal.
plan = customer.GetPlan();
```

### php

```php
// Before
if ($customer === null) {
  $plan = BillingPlan::basic();
} else {
  $plan = $customer->getPlan();
}

// After
class NullCustomer extends Customer {
  public function isNull() {
    return true;
  }
  public function getPlan() {
    return new NullPlan();
  }
  // Otra funcionalidad NULL.
}

// Reemplaza los valores null por el objeto nulo.
$customer = ($order->customer !== null) ?
  $order->customer :
  new NullCustomer;

// Usa el objeto nulo como si fuera una subclase normal.
$plan = $customer->getPlan();
```

### python

```python
// Before
if customer is None:
    plan = BillingPlan.basic()
else:
    plan = customer.getPlan()

// After
class NullCustomer(Customer):

    def isNull(self):
        return True

    def getPlan(self):
        return self.NullPlan()

    # Otra funcionalidad NULL.

# Reemplaza los valores null por el objeto nulo.
customer = order.customer or NullCustomer()

# Usa el objeto nulo como si fuera una subclase normal.
plan = customer.getPlan()
```

### typescript

```typescript
// Before
if (customer == null) {
  plan = BillingPlan.basic();
}
else {
  plan = customer.getPlan();
}

// After
class NullCustomer extends Customer {
  isNull(): boolean {
    return true;
  }
  getPlan(): Plan {
    return new NullPlan();
  }
  // Otra funcionalidad NULL.
}

// Reemplaza los valores null por el objeto nulo.
let customer = (order.customer != null) ?
  order.customer : new NullCustomer();

// Usa el objeto nulo como si fuera una subclase normal.
plan = customer.getPlan();
```

