La notion de "citoyen de première classe" ou "élément de première classe" dans un langage de programmation a été introduite par l'informaticien britannique Christopher Strachey dans les années 1960 dans le contexte de fonctions de première classe. La formulation la plus célèbre de ce principe est probablement dans Structure et interprétation des programmes informatiques de Gerald Jay Sussman et Harry Abelson:
- Ils peuvent être nommés par des variables.
- Ils peuvent être transmis en tant qu'arguments aux procédures.
- Ils peuvent être renvoyés à l'issue des procédures.
- Ils peuvent être inclus dans les structures de données.
En gros, cela signifie que vous pouvez faire avec cet élément de langage de programmation tout ce que vous pouvez faire avec tous les autres éléments du langage de programmation.
Tout est une question "d'égalité des droits": vous pouvez faire tout ce qui précède, avec, par exemple, des nombres entiers, alors pourquoi une autre chose devrait-elle être différente?
La définition ci-dessus est un peu restrictive dans le sens où elle ne parle que de l'aspect de première classe en tant qu'objets du programme. Une définition plus générale serait qu'une chose est de première classe si vous pouvez tout faire avec elle, vous pouvez également faire avec d'autres choses du même genre.
Par exemple, les opérateurs et les méthodes Java sont du même type. Vous pouvez définir de nouvelles méthodes, vous pouvez (un peu) choisir librement les noms de vos propres méthodes, vous pouvez remplacer des méthodes, vous pouvez surcharger des méthodes. James Gosling peut également faire tout cela avec des opérateurs, mais vous et moi ne le pouvons pas. Je veux dire, contrairement à la croyance populaire, Java ne surcharge d'opérateur de support: par exemple, l' +
opérateur est surchargé pour byte
, short
, int
, long
, float
, double
et String
, et IIRC en Java 7 aussi BigInteger
et BigDecimal
(et probablement deux ou trois j'ai oublié), il est juste que vousne pas avoir d'influence sur elle. Cela place clairement les opérateurs de deuxième classe selon cette deuxième définition. Notez que les méthodes ne sont toujours pas des objets de première classe selon la première définition. (Cela fait-il des opérateurs de troisième classe?)