Se introdujo la noción de "ciudadano de primera clase" o "elemento de primera clase" en un lenguaje de programación por el científico informático británico Christopher Strachey en la década de 1960 en el contexto de las funciones de primera clase. La formulación más famosa de este principio se encuentra probablemente en Estructura e interpretación de los programas de computadora por Gerald Jay Sussman y Harry Abelson:
- Se pueden nombrar por variables.
- Se pueden pasar como argumentos a procedimientos.
- Pueden devolverse como resultado de los procedimientos.
- Se pueden incluir en las estructuras de datos.
Básicamente, significa que puedes hacer con este elemento del lenguaje de programación todo lo que puedes hacer con todos los demás elementos del lenguaje de programación.
Todo se trata de "derechos iguales": puedes hacer todo lo anterior con, digamos, enteros, ¿por qué debería ser diferente cualquier otra cosa?
La definición anterior es un poco restrictiva en el sentido de que solo se refiere al aspecto de primera clase en relación con los objetos del programa. Una definición más general sería que una cosa es de primera clase. Si puedes hacer todo con ella, también puedes hacerlo con otras cosas de tipo similar.
Por ejemplo, los operadores de Java y los métodos de Java son de tipo similar. Puede definir nuevos métodos, puede (un poco) elegir libremente los nombres de sus propios métodos, puede anular métodos, puede sobrecargar métodos. James Gosling también puede hacer todo eso con los operadores, pero tú y yo no podemos. Quiero decir, contrariamente a la creencia popular, Java sí admite la sobrecarga de operadores: por ejemplo, el operador +
está sobrecargado para byte
, short
, int
, long
, float
, double
y String
, e IIRC en Java 7 también para BigInteger
y BigDecimal
(y probablemente un par olvidé), es solo que usted no tiene ninguna influencia encima de eso. Eso claramente hace que los operadores sean de segunda clase según esta segunda definición. Tenga en cuenta que los métodos aún no son objetos de primera clase según la primera definición, sin embargo. (¿Eso hace que los operadores sean de tercera clase?)