A noção de "cidadão de primeira classe" ou "elemento de primeira classe" em uma linguagem de programação foi introduzida pelo cientista de computação britânico Christopher Strachey na década de 1960, no contexto de funções de primeira classe. A formulação mais famosa desse princípio está provavelmente em Estrutura e interpretação de programas de computador por Gerald Jay Sussman e Harry Abelson:
- Eles podem ser nomeados por variáveis.
- Eles podem ser passados como argumentos para procedimentos.
- Eles podem ser retornados como resultados dos procedimentos.
- Eles podem ser incluídos nas estruturas de dados.
Basicamente, isso significa que você pode fazer com esse elemento da linguagem de programação tudo o que você pode fazer com todos os outros elementos na linguagem de programação.
É tudo sobre "direitos iguais": você pode fazer tudo o que precede, com, digamos, números inteiros. Por que outra coisa deveria ser diferente?
A definição acima é um pouco restritiva, no sentido de que realmente fala apenas sobre o aspecto de primeira classe relacionado a ser objeto do programa. Uma definição mais geral seria que uma coisa é de primeira classe, se você pode fazer tudo com ela, também pode fazer com outras coisas de tipo semelhante.
Por exemplo, operadores e métodos Java são de tipo semelhante. Você pode definir novos métodos, pode (um pouco) escolher livremente os nomes de seus próprios métodos, pode substituir métodos, pode sobrecarregar métodos. James Gosling também pode fazer tudo isso com os operadores, mas você e eu não podemos. Quer dizer, ao contrário da crença popular, Java faz sobrecarga de operadores de apoio: por exemplo, o +
operador é sobrecarregado para byte
, short
, int
, long
, float
, double
e String
, e IIRC em Java 7 também para BigInteger
e BigDecimal
(e provavelmente um casal I esqueceu), é só que vocênão tem nenhuma influência sobre isso. Isso claramente torna os operadores de segunda classe, de acordo com esta segunda definição. Observe que os métodos ainda não são objetos de primeira classe, de acordo com a primeira definição. (Isso torna os operadores de terceira classe?)