DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

Resumo - Item 89: Dê preferência aos tipos enum em vez do readResolve para controle de instância

Atenção: Com as evoluções do Java e práticas modernas, existem alternativas mais seguras e eficientes para lidar com serialização/desserialização. Mas como estamos estudando o livro vamos considerar para aprender. VER NO TÓPICO FINAL SOBRE SERIALIZAÇÃO

Problema do Singleton e Serialização

  • Um singleton pode perder sua unicidade se for declarado como Serializable.
  • A serialização cria uma nova instância ao desserializar, quebrando a restrição do singleton.
  • O método readResolve pode ser usado para substituir a instância desserializada pela instância original.

Vulnerabilidade do readResolve

  • Se um singleton tiver campos não transientes, um invasor pode capturar uma referência à instância antes da execução do readResolve.
  • Isso permite criar múltiplas instâncias do singleton, contornando a restrição de instância única.
  • O ataque pode ser feito utilizando uma classe "ladra" que explora a desserialização circular para obter uma cópia do singleton antes que ele seja resolvido.

Solução mais segura: Usar enum para Singletons

  • Enums são implicitamente serializáveis e garantem que só existe uma única instância.
  • O Java impede a criação de novas instâncias além das constantes declaradas no enum.

Exemplo seguro:

public enum Elvis {
    INSTANCE;
    public void sing() { System.out.println("Love me tender"); }
}

Enter fullscreen mode Exit fullscreen mode

Quando ainda usar readResolve?

  • Se a classe não pode ser um enum e precisa ser controlada por instância.
  • Deve garantir que todos os campos de referência sejam transientes.
  • O readResolve deve ter a acessibilidade adequada (privado em classes final).

Conclusão

  • Prefira enum para singletons, pois é seguro e simples.
  • Se precisar usar readResolve, tome precauções para evitar ataques.

Exemplos de códigos do livro:

Image description

Image description

Image description

Image description

Image description

Image description

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more