Java après une éruption volcanique

Un employeur sarcastique m'a demandé d'améliorer Java, et bien que je ne sois pas président de l'Indonésie, je me suis précipité rapidement pour devenir accidentellement perplexe pendant une demi-journée. J'aimerais ça comme ça. Le principe général est une simplification maximale sans perte de contrôle logique. Pour cela, évidemment, il faut non seulement ajouter à la langue ce qui n'était pas là, mais aussi retirer de la langue beaucoup de ce qui était là, en poursuivant la bonne tradition de C--.


  1. Possibilité de renvoyer plus d'un résultat d'une fonction.
  2. Les valeurs par défaut des champs primitifs doivent être déclarées explicitement. Supprimez le modificateur «statique» de la langue, en tant que statique - l'instance par défaut, accessible par référence au null tapé. Appelez-le tout "instance par défaut". La possibilité du modificateur «abstrait» pour les champs, ce qui signifiera à la fois l'impossibilité de créer une instance de la classe et la nécessité de spécifier la valeur par défaut de ce champ dans le descendant de la classe.
  3. Pour les champs "protégés", "par défaut" et "publics", les setters et les getters se génèrent automatiquement par le compilateur, sans génération automatique de tris visibles, mais avec la possibilité de les surcharger, supprimez "private" de la langue, car les "champs" eux-mêmes seront tous "privés" sans capacités de surcharge. Ajouter "local" - à ce sujet au paragraphe 8.
  4. Génération automatique d'interfaces publiques à partir de tous les champs «publics» de la classe, ainsi que d'un nouveau type de protection, etc. interfaces des champs correspondant au modificateur. Les types de classe sont comparés par un code de hachage, qui sera généré par les noms de champ, les noms d'argument, les types et les valeurs de retour, car la probabilité que tout cela coïncide est négligeable et peut être détectée au moment de la compilation avec des avertissements.

    Ainsi, «interface» en tant que telle n'est plus nécessaire, seule «classe», «abstrait» n'est qu'une instruction interdisant la création d'une instance. Pour l'héritage multiple, voir le paragraphe 5 suivant.
  5. Ajout de règles de fusion pour "étend". Spécifiez explicitement l'ancêtre de tous les champs en conflit, qui ne peuvent pas être distingués des méthodes, plus à ce sujet dans la clause 8. Par conséquent, l'objet héritera du code et implémentera tous les types parents. Les types qui ne sont pas entièrement conservés à la suite de la fusion disparaissent simplement des ancêtres formels, laissant le code, mais créant une erreur de compilation lors d'une tentative d'utilisation abusive de l'objet.
  6. Types dynamiques. Les modèles sont en C et non en tant que modèles basés sur Java. La saisie n'en souffrira pas, car les types dynamiques ne peuvent pas être directement utilisés dans les exemples, mais peuvent être utilisés dans tous les cas lorsque des types de base ou des réflexions ou des modèles sont utilisés, dans lesquels il n'est pas non plus difficile d'organiser une nouvelle planification en étendant le type d'instance directement à l'exécution, la restriction est interdite.
  7. Sous-méthodes comme en Pascal.
  8. Toutes les méthodes sont des instances par défaut complètes des classes internes et ne peuvent être distinguées des champs. Pour cela, le constructeur de classe renverra une valeur. Le constructeur de la classe sera le corps de la méthode par défaut qui sera créée au moment de la compilation, conformément à l'article 2 «instances par défaut». Aucune référence de méthode spéciale ne sera plus nécessaire, comme dans Java 8. Une référence de méthode signifiera une référence d'objet.

    L'appel de méthode et la création d'un objet temporaire uniquement pour appeler la méthode interne deviennent identiques, tout cela peut être optimisé par le compilateur comme un simple appel de méthode. D'un autre côté, créer une «méthode» avec l'opérateur «nouveau», pour les manipulations ultérieures avec une référence à celui-ci, signifie créer une nouvelle instance de la «classe». Affectation d'une référence à une fonction à un champ directement via le nom de la méthode sans crochets, valeurs de fonction avec crochets et arguments. Les champs avec le modificateur "local" ne sont pas enregistrés entre les appels de méthode.

    Toutes les mêmes méthodes avec différents ensembles d'arguments doivent être regroupées dans une sous-classe, de sorte qu'il serait bien de jeter la classe externe. Les champs par défaut de cette sous-classe ne deviennent, respectivement, pas absolument statiques, mais statiques par rapport à la classe externe. Sauf lorsque la classe externe elle-même est l'instance par défaut.
  9. Au lieu de «try» - «catch», il existe également des méthodes, «throws» identifie le type autorisé de la méthode appelante, «throw» fait passer à la méthode du gestionnaire, coupant la pile d'appels, et les méthodes du gestionnaire elles-mêmes ne sont pas différentes, le retour de celles-ci est effectué de la manière habituelle, mais , il se trouve que dans l'une des méthodes d'appel précédentes. Par conséquent, un gestionnaire est appelé au niveau de hiérarchie le plus proche, comme c'est le cas avec try-catch. Ainsi, afin de sauter par-dessus un certain code en suivant une certaine méthode dans le cas d'une exception, vous devez placer ce code, avec cette certaine méthode au début, dans une sous-méthode-classe dans laquelle surcharger les gestionnaires nécessaires. Cette approche raccourcira considérablement le long, pour le moins, les méthodes de projets réels en Java.

    "Enfin" pour ajouter un poids à la méthode à la fin, de sorte que sans parenthèses supplémentaires.
  10. Un nouvel opérateur pour l'exécution chiffrant toutes sortes de primitives et tableaux de champs primitifs et String et les compressant en mémoire pour les récupérer ultérieurement avec une clé d'accès, en vrac pour toute l'instance de la classe. Vouloir directement décompresser-utiliser-pack en une seule méthode, plutôt que de me gratter la tête "comment faire mieux".
  11. Les tableaux nécessitent un contrôle des frontières uniquement pendant l'enregistrement, et je donnerais la possibilité de lire directement à partir de la mémoire sans contrôler les limites du tableau. Ainsi, étant donné l'existence de System.arraycopy, les limites des tableaux seront surveillées sans sacrifier les performances. Étant donné que la plupart des calculs supplémentaires sont le plus souvent effectués pendant l'enregistrement et que, par rapport à eux, l'enregistrement lui-même ne prend pas beaucoup de temps.
  12. Fournir une alternative de base supplémentaire à la synchronisation par les bloqueurs est la méthode la plus simple de la classe Thread qui envoie des messages personnalisés à d'autres Threads et la méthode par laquelle vous pouvez recevoir des messages personnalisés d'autres Threads. De plus, dans la méthode "run" de l'objet Runnable, qui est passé à Thread, vous devez explicitement appeler la méthode qui interrompt le thread, et sans erreur de compilation. Ajoutez également une méthode qui déclenche des événements Runnable personnalisés à partir d'autres threads, reçoit et envoie des messages à chaque fois après cette interruption. Tout cela ne change fondamentalement rien, mais cela simplifiera le développement orienté thread dans 90% des cas. Surtout dans les cas où le développement est hâtif, et c'est la majorité des cas réels.
  13. En fait, le graphe de tous les objets en mémoire n'a toujours que des types primitifs, des tableaux, ou null, ou un lien vers quelque chose de natif à tous ses sommets. Un outil de base qui peut enregistrer l'intégralité de ce graphique sous n'importe quelle forme de texte sera très utile. Les grands tableaux de primitives peuvent être stockés séparément, les petits tableaux peuvent coder en ligne. De plus, la version de la machine virtuelle et - allons-y, une telle structure peut être restaurée en mémoire.
  14. Un outil utile pour rechercher des objets dans le graphe d'objets selon des critères spécifiés, en tenant compte des modificateurs d'accès, par type de SQL simple. Cette tâche est grandement simplifiée à l'aide des paragraphes 1 à 9. Un tel outil peut non seulement simplifier la hiérarchie des objets, mais également organiser divers tests et le contrôle des valeurs autorisées et essayer de rattraper le Prolog.

Source: https://habr.com/ru/post/fr439210/


All Articles