Pular para o conteúdo principal

Constantes e Enums

Constantes e enumerações ajudam a criar código legível e manutenível. Aqui está como diferentes linguagens lidam com elas.

Constantes​

// const (block-scoped, not deeply immutable)
const PI = 3.14159;
const MAX_SIZE = 100;
const API_URL = "https://api.example.com";

// const objects can be mutated!
const config = { debug: true };
config.debug = false; // OK!

// Object.freeze (shallow immutable)
const frozen = Object.freeze({ a: 1, b: 2 });
// frozen.a = 3; // Silently fails (or error in strict)

// Deep freeze (recursive)
function deepFreeze(obj) {
Object.freeze(obj);
Object.values(obj).forEach(v => {
if (typeof v === 'object') deepFreeze(v);
});
return obj;
}

// Enum pattern (no native enums in JS)
const Status = Object.freeze({
ACTIVE: 'active',
INACTIVE: 'inactive',
BANNED: 'banned',
});

Principais Conclusões​

  • Imutabilidade verdadeira -- const em Rust, const em Zig e constexpr em C++ fornecem constantes em tempo de compilação que não podem ser alteradas. const em JavaScript apenas previne reatribuição: const obj = {}; obj.x = 1 é permitido. Python não tem constantes verdadeiras; PI = 3.14 pode ser reatribuído. Use Object.freeze() em JavaScript ou typing.Final em Python para imutabilidade baseada em convenção, mas estas não são aplicadas tão rigidamente quanto em Rust ou Zig. Para máxima segurança, prefira linguagens com constantes aplicadas pelo compilador.

  • Tipos algébricos de dados -- Enums de Rust e Swift podem carregar valores associados, habilitando tipos soma. Por exemplo, enum Shape { Circle(f64), Rectangle(f64, f64) } em Rust permite que cada variante contenha dados. Tagged unions do Zig e enum Shape { case circle(radius: Double) } do Swift funcionam de forma similar. Isso habilita pattern matching exaustivo e evita estados inválidos. Ao modelar máquinas de estado ou variantes com payloads, prefira Rust, Swift ou Zig em vez de enums inteiros simples.

  • Capacidades de enum por linguagem -- Enums de Java e C# suportam métodos e campos: enum Color { RED("#FF0000"); private String hex; Color(String h) { hex = h; } }. Go usa iota para enums inteiros: const (Red = iota; Green; Blue). Enums de C são inteiros simples sem segurança de tipo; eles poluem o namespace global. PHP 8.1+ e o módulo enum do Python fornecem enums de primeira classe. Quando você precisa de enums com comportamento ou segurança de tipo, prefira Java, C#, Rust, Swift ou Python; para flags simples, C ou iota do Go podem ser suficientes.

  • Definindo constantes -- C usa #define para constantes do pré-processador; C++ adiciona const e constexpr. Java e C# usam static final; Go usa const; Rust usa const (tempo de compilação) ou static (tempo de execução, instância única). Python e Ruby dependem de convenções de nomenclatura (UPPER_CASE). Para avaliação em tempo de compilação e inlining, prefira constexpr (C++) ou const (Rust, Zig); para constantes de tempo de execução computadas uma vez, use static em Rust ou static readonly em C#.