Ein sarkastischer Arbeitgeber bat mich, Java zu verbessern, und obwohl ich nicht der Präsident Indonesiens bin, rannte ich schnell davon, um versehentlich einen halben Tag lang verwirrt zu sein. Ich würde es so mögen. Das allgemeine Prinzip ist maximale Vereinfachung ohne Verlust der logischen Kontrolle. Dazu ist es natürlich notwendig, nicht nur der Sprache hinzuzufügen, was nicht da war, sondern auch viel von dem, was da war, aus der Sprache zu entfernen, um die gute Tradition von C-- fortzusetzen.
- Möglichkeit, mehr als ein Ergebnis einer Funktion zurückzugeben.
- Die Standardwerte primitiver Felder müssen explizit deklariert werden. Entfernen Sie den Modifikator "statisch" aus der Sprache als statisch - die Standardinstanz, auf die unter Bezugnahme auf die eingegebene Null zugegriffen werden kann. Nennen Sie alles "Standardinstanz". Die Möglichkeit des Modifikators "abstrakt" für Felder, der sowohl die Unfähigkeit bedeutet, eine Instanz der Klasse zu erstellen, als auch die Notwendigkeit, den Standardwert dieses Felds im Nachkommen der Klasse anzugeben.
- Bei "geschützten", "Standard" - und "öffentlichen" Feldern werden die Setter und Getter vom Compiler automatisch generiert, ohne dass sichtbare Sortierungen automatisch generiert werden. Entfernen Sie jedoch "privat" aus der Sprache, da die "Felder" selbst alle "privat" sind Überlastungsmöglichkeiten. Fügen Sie "local" hinzu - dazu in Absatz 8.
- Automatische Generierung öffentlicher Schnittstellen aus allen "öffentlichen" Feldern der Klasse sowie einer neuen Art von geschützten usw. Schnittstellen aus den Feldern, die dem Modifikator entsprechen. Klassentypen werden mit Hash-Code verglichen, der durch Feldnamen, Argumentnamen, Typen und Rückgabewerte generiert wird, da die Wahrscheinlichkeit, dass all dies zusammenfällt, vernachlässigbar ist und zur Kompilierungszeit mit Warnungen erkannt werden kann.
Somit wird "Schnittstelle" als solche nicht mehr benötigt, nur "Klasse", "abstrakt" ist nur eine Anweisung, die die Erstellung einer Instanz verbietet. Informationen zur Mehrfachvererbung finden Sie im nächsten Absatz 5. - Hinzufügen von Zusammenführungsregeln für "Erweitert". Geben Sie den Vorfahren explizit für alle widersprüchlichen Felder an, die nicht von Methoden zu unterscheiden sind, mehr dazu in Abschnitt 8. Infolgedessen erbt das Objekt den Code und implementiert alle übergeordneten Typen. Typen, die infolge der Zusammenführung nicht vollständig erhalten wurden, verschwinden einfach aus den formalen Vorfahren, verlassen den Code, verursachen jedoch einen Kompilierungsfehler, wenn versucht wird, das Objekt zu missbrauchen.
- Dynamische Typen. Vorlagen befinden sich in C und nicht als Java-basierte Vorlagen. Die Typisierung leidet nicht darunter, da dynamische Typen nicht direkt in Beispielen verwendet werden können, sondern in allen Fällen verwendet werden können, wenn Basistypen oder Reflexionen oder Vorlagen verwendet werden, in denen es auch nicht schwierig ist, die Neuplanung zu organisieren, indem der Instanztyp direkt auf Laufzeit erweitert wird. Eine Einschränkung ist verboten.
- Untermethoden wie in Pascal.
- Alle Methoden sind vollständige Standardinstanzen der inneren Klassen und von den Feldern nicht zu unterscheiden. Dazu gibt der Klassenkonstruktor einen Wert zurück. Der Konstruktor der Klasse ist der Hauptteil der Standardmethode, die zur Kompilierungszeit gemäß Abschnitt 2 „Standardinstanzen“ erstellt wird. Wie in Java 8 werden keine speziellen Methodenreferenzen mehr benötigt. Eine Methodenreferenz bedeutet eine Objektreferenz.
Der Methodenaufruf und die Erstellung eines temporären Objekts nur zum Aufrufen der internen Methode werden identisch. All dies kann vom Compiler als einfacher Methodenaufruf optimiert werden. Andererseits bedeutet das Erstellen einer „Methode“ mit dem Operator „new“ für nachfolgende Manipulationen mit einem Verweis darauf, dass eine neue Instanz der „Klasse“ erstellt wird. Zuweisen eines Verweises auf eine Funktion zu einem Feld direkt über den Methodennamen ohne Klammern, Funktionswerte mit Klammern und Argumenten. Felder mit dem Modifikator "local" werden zwischen Methodenaufrufen nicht gespeichert.
Dieselben Methoden mit unterschiedlichen Argumenten müssen in einer Unterklasse zusammengefasst werden, damit es schön wäre, die äußere Klasse zu verschmutzen. Die Standardfelder dieser Unterklasse werden nicht absolut statisch, sondern relativ zur äußeren Klasse. Außer wenn die äußere Klasse selbst die Standardinstanz ist. - Anstelle von "try" - "catch" gibt es auch Methoden. "Throws" identifiziert den zulässigen Typ der aufrufenden Methode. "Throw" führt die Handler-Methode aus, schneidet den Callstack ab und die Handler-Methoden selbst unterscheiden sich nicht. Die Rückkehr von ihnen erfolgt auf die übliche Weise Es kommt also vor, dass in einer der vorherigen Aufrufmethoden. Dementsprechend wird ein Handler auf der nächstgelegenen Hierarchieebene aufgerufen, wie dies beim Try-Catch der Fall ist. Um im Falle einer Ausnahme nach einer bestimmten Methode über einen bestimmten Code zu springen, müssen Sie diesen Code mit dieser bestimmten Methode am Anfang in eine Untermethodenklasse einfügen, in der die erforderlichen Handler überladen werden. Dieser Ansatz wird die langen, gelinde gesagt, Methoden realer Projekte in Java erheblich verkürzen.
"Endlich", um der Methode am Ende ein Gewicht hinzuzufügen, so dass ohne zusätzliche Klammern. - Ein neuer Operator zum Laufzeitverschlüsseln aller Arten von Grundelementen und Arrays von Grundfeldern und Zeichenfolgen und Komprimieren im Speicher, um sie anschließend mit einem Zugriffsschlüssel abzurufen, und zwar in großen Mengen für die gesamte Instanz der Klasse. Direkt auspacken-verwenden-packen in einer Methode, anstatt meinen Kopf zu kratzen "wie man es besser macht".
- Arrays benötigen nur während der Aufnahme eine Rahmenkontrolle, und ich würde die Möglichkeit geben, direkt aus dem Speicher zu lesen, ohne die Grenzen des Arrays zu kontrollieren. Angesichts der Existenz von System.arraycopy werden Array-Grenzen überwacht, ohne die Leistung zu beeinträchtigen. Da die meisten zusätzlichen Berechnungen am häufigsten während der Aufzeichnung durchgeführt werden und die Aufzeichnung selbst im Vergleich zu ihnen nicht viel Zeit in Anspruch nimmt.
- Die einfachste Methode in der Thread-Klasse, mit der benutzerdefinierte Nachrichten an andere Threads gesendet werden, und die Methode, mit der Sie benutzerdefinierte Nachrichten von anderen Threads empfangen können, bietet eine zusätzliche grundlegende Alternative zur Synchronisierung durch Blocker. Darüber hinaus muss in der "run" -Methode des Runnable-Objekts, die an Thread übergeben wird, die Methode, die den Thread unterbricht, explizit und ohne Kompilierungsfehler aufgerufen werden. Fügen Sie außerdem eine Methode hinzu, die benutzerdefinierte ausführbare Ereignisse von anderen Threads auslöst, Nachrichten jedes Mal nach diesem Interrupt empfängt und sendet. All dies ändert grundsätzlich nichts, vereinfacht jedoch in 90% der Fälle die threadorientierte Entwicklung. Besonders in Fällen, in denen die Entwicklung in Eile ist, und dies ist die Mehrheit der realen Fälle.
- Tatsächlich enthält der Graph aller Objekte im Speicher immer nur primitive Typen, Arrays oder Null oder eine Verknüpfung zu etwas Nativem an allen Scheitelpunkten. Ein grundlegendes Werkzeug, mit dem das gesamte Diagramm in einer beliebigen Textform gespeichert werden kann, ist sehr nützlich. Große Arrays von Grundelementen können separat gespeichert werden, kleine Arrays können inline codieren. Plus die Version der virtuellen Maschine und - los geht's, eine solche Struktur kann im Speicher wiederhergestellt werden.
- Ein nützliches Tool zum Suchen nach Objekten im Objektdiagramm nach festgelegten Kriterien unter Berücksichtigung von Zugriffsmodifikatoren nach der Art von einfachem SQL. Diese Aufgabe wird durch die Absätze 1 ... 9 erheblich vereinfacht. Ein solches Werkzeug kann nicht nur die Hierarchie von Objekten vereinfachen, sondern auch verschiedene Tests und die Kontrolle zulässiger Werte organisieren und versuchen, den Prolog einzuholen.