La noción de "ciudadano de primera clase" o "elemento de primera clase" en un lenguaje de programación fue introducida por el científico informático británico Christopher Strachey en la década de 1960 en el contexto de funciones de primera clase. La formulación más famosa de este principio se encuentra probablemente en Estructura e interpretación de programas de computadora por Gerald Jay Sussman y Harry Abelson:
- Pueden ser nombrados por variables.
- Se pueden pasar como argumentos a los procedimientos.
- Pueden ser devueltos como resultado de los procedimientos.
- Pueden incluirse en estructuras de datos.
Básicamente, significa que puede hacer con este elemento del lenguaje de programación todo lo que puede hacer con todos los demás elementos del lenguaje de programación.
Se trata de "igualdad de derechos": puede hacer todo lo anterior con, digamos, números enteros, entonces, ¿por qué debería ser diferente cualquier otra cosa?
La definición anterior es un poco restrictiva en el sentido de que solo habla realmente sobre el aspecto de primera clase en relación con ser 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 hacer otras cosas similares.
Por ejemplo, los operadores de Java y los métodos de Java son de tipo similar. Puede definir nuevos métodos, puede (de alguna manera) elegir libremente los nombres de sus propios métodos, puede anular los métodos, puede sobrecargar los métodos. James Gosling también puede hacer todo eso con los operadores, pero usted y yo no podemos. Es decir, contrariamente a la creencia popular, Java hace la sobrecarga de operadores de apoyo: por ejemplo, el +
operador está sobrecargado para byte
, short
, int
, long
, float
, double
y String
, y IIRC en Java 7 también para BigInteger
e BigDecimal
(y probablemente un par me olvidó), es sólo que seno tengo ninguna influencia sobre eso. Eso claramente hace que los operadores sean de segunda clase de acuerdo con esta segunda definición. Sin embargo, tenga en cuenta que los métodos todavía no son objetos de primera clase según la primera definición. (¿Eso hace que los operadores sean de tercera clase?)