---
title: "Introduzir Extensão Local"
type: "refactoring-technique"
slug: "introduce-local-extension"
url: "http://localhost:3000/pt-br/introduce-local-extension.md"
category: "Moving Features between Objects"
description: "Problema: uma classe utilitária não contém alguns métodos de que você precisa. Mas você não pode adicionar esses métodos à classe. Solução: crie uma nova classe contendo os métodos e torne-a filha ou wrapper da classe utilitária."
---
# Introduzir Extensão Local

> Problema: uma classe utilitária não contém alguns métodos de que você precisa. Mas você não pode adicionar esses métodos à classe. Solução: crie uma nova classe contendo os métodos e torne-a filha ou wrapper da classe utilitária.

## Problem

Uma classe utilitária não contém alguns métodos de que você precisa. Mas você não pode adicionar esses métodos à classe.

## Solution

Crie uma nova classe contendo os métodos e torne-a filha ou wrapper da classe utilitária.

## Why Refactor

A classe que você está usando não tem os métodos de que você precisa. Pior ainda, você não pode adicionar esses métodos (porque as classes estão em uma biblioteca de terceiros, por exemplo). Há duas saídas:

* Criar uma **subclasse** a partir da classe relevante, contendo os métodos e herdando todo o resto da classe pai. Essa forma é mais fácil, mas às vezes é bloqueada pela própria classe utilitária (por causa do `final`).
* Criar uma classe **wrapper** que contém todos os novos métodos e que, no restante, delega ao objeto relacionado da classe utilitária. Esse método dá mais trabalho, pois você precisa não apenas de código para manter a relação entre o wrapper e o objeto utilitário, mas também de um grande número de métodos de delegação simples para emular a interface pública da classe utilitária.

## Benefits

* Ao mover métodos adicionais para uma classe de extensão separada (wrapper ou subclasse), você evita entulhar as classes clientes com código que não se encaixa. Os componentes do programa ficam mais coerentes e mais reutilizáveis.

## How to Refactor

1. Crie uma nova classe de extensão:

  * Opção A: torne-a filha da classe utilitária.
  * Opção B: se você decidiu criar um wrapper, crie nele um campo para armazenar o objeto da classe utilitária ao qual a delegação será feita. Ao usar esta opção, você precisará também criar métodos que repitam os métodos públicos da classe utilitária e contenham uma simples delegação aos métodos do objeto utilitário.
2. Crie um construtor que use os parâmetros do construtor da classe utilitária.
3. Crie também um construtor “de conversão” alternativo que receba apenas o objeto da classe original em seus parâmetros. Isso ajudará a substituir os objetos da classe original pela extensão.
4. Crie os novos métodos estendidos na classe. Mova métodos estrangeiros de outras classes para esta classe ou então exclua os métodos estrangeiros se sua funcionalidade já estiver presente na extensão.
5. Substitua o uso da classe utilitária pela nova classe de extensão nos lugares onde sua funcionalidade é necessária.
## Relations

**Similar techniques**

- [Introduzir Método Estrangeiro](/pt-br/introduce-foreign-method.md)

**Eliminates smells**

- [Classe de Biblioteca Incompleta](/pt-br/smells/incomplete-library-class.md)

