JavaRush /Java-Blog /Random-DE /Kaffeepause Nr. 134. Was Sie beim Schreiben von Java-Code...

Kaffeepause Nr. 134. Was Sie beim Schreiben von Java-Code vermeiden sollten. Wie „final“, „finally“ und „finalize“ in Java verwendet werden

Veröffentlicht in der Gruppe Random-DE

Was Sie beim Schreiben von Java-Code vermeiden sollten

Quelle: Medium Wir machen Sie auf einen Artikel aufmerksam, der häufige Fehler auflistet, die Entwickler beim Schreiben von Java-Code machen. Kaffeepause Nr. 134.  Was Sie beim Schreiben von Java-Code vermeiden sollten.  Wie „final“, „finally“ und „finalize“ in Java verwendet werden – 1

Verwenden von Enum.values

Dass dies als Fehler angesehen wurde, überraschte mich, da ich Enum.values ​​​​regelmäßig verwendete . Das Problem hierbei ist, dass Enum.values() laut Spezifikation eine unveränderliche Liste sein soll. Dazu muss es bei jedem Aufruf eine neue Instanz des Arrays mit den Enum-Werten zurückgeben.
public enum Fruits {
    APPLE, PEAR, ORANGE, BANANA;

    public static void main(String[] args) {
        System.out.println(Fruits.values());
        System.out.println(Fruits.values());
    }
}
// output
// [Lcom.test.Fruits;@7ad041f3
// [Lcom.test.Fruits;@251a69d7
Es gibt hier zwei separate Objekte im Speicher, es scheint also nicht so, als wäre das eine große Sache. Wenn Sie jedoch Fruit.values() bei der Verarbeitung einer Anfrage verwenden und eine hohe Auslastung vorliegt, kann dies zu Speicherproblemen führen. Sie können dies leicht beheben, indem Sie eine private statische Endvariable VALUES für das Caching einführen.

Übergabe optionaler Parameter als Methodenparameter

Betrachten Sie den folgenden Code:
LocalDateTime getCurrentTime(Optional<ZoneId> zoneId) {
    return zoneId.stream()
        .map(LocalDateTime::now)
        .findFirst()
        .orElse(LocalDateTime.now(ZoneId.systemDefault()));
}
Wir übergeben den optionalen Parameter zoneId und entscheiden anhand seines Vorhandenseins, ob die Zeit in der Systemzeitzone angegeben oder die angegebene Zone verwendet werden soll. Dies ist jedoch nicht die richtige Art, mit Optional zu arbeiten. Wir sollten sie nicht als Parameter verwenden und stattdessen Methodenüberladung verwenden.
LocalDateTime getCurrentTime(ZoneId zoneId) {
  return LocalDateTime.now(zoneId);
}

LocalDateTime getCurrentTime() {
  return getCurrentTime(ZoneId.systemDefault());
}
Der Code, den Sie oben sehen, ist viel einfacher zu lesen und zu debuggen.

Verwendung von StringBuilder

Zeichenfolgen in Java sind unveränderlich. Dies bedeutet, dass sie nach ihrer Erstellung nicht mehr bearbeitet werden können. Die JVM verwaltet einen String-Pool und ruft vor dem Erstellen eines neuen die Methode String.intern() auf , die eine dem Wert entsprechende Instanz aus dem String-Pool zurückgibt, sofern vorhanden. Nehmen wir an, wir möchten eine lange Zeichenfolge erstellen, indem wir darin Elemente verketten.
String longString = new StringBuilder()
  .append("start")
  .append("middle")
  .append("middle")
  .append("middle")
  .append("end")
  .toString();
Kürzlich wurde uns gesagt, dass dies eine sehr schlechte Idee sei, da ältere Java-Versionen Folgendes taten:
  • In Zeile 1 wird der String „start“ in den String-Pool eingefügt und von longString darauf gezeigt
  • Zeile 2 fügt den String „startmiddle“ zum Pool hinzu und zeigt mit longString darauf
  • in Zeile 3 haben wir „startmiddlemiddle“
  • in Zeile 4 - „startmiddlemiddlemiddle“
  • und schließlich fügen wir in Zeile 5 „startmiddlemiddlemiddleend“ zum Pool hinzu und zeigen longString darauf
Alle diese Zeilen verbleiben im Pool und werden nie verwendet, was zu einer großen RAM-Verschwendung führt. Um dies zu vermeiden, können wir StringBuilder verwenden.
String longString = new StringBuilder()
  .append("start")
  .append("middle")
  .append("middle")
  .append("middle")
  .append("end")
  .toString();
StringBuilder erstellt beim Aufruf der toString- Methode nur einen String und entfernt so alle Zwischenstrings, die ursprünglich zum Pool hinzugefügt wurden. Ab Java 5 erfolgt dies jedoch automatisch durch den Compiler , daher ist es besser, die String-Verkettung mit „+“ zu verwenden.

Verwendung primitiver Wrapper, wenn sie nicht benötigt werden

Betrachten Sie die folgenden zwei Fragmente:
int sum = 0;
for (int i = 0; i < 1000 * 1000; i++) {
  sum += i;
}
System.out.println(sum);
Integer sum = 0;
for (int i = 0; i < 1000 * 1000; i++) {
  sum += i;
}
System.out.println(sum);
Das erste Beispiel läuft auf meinem Computer sechsmal schneller als das zweite. Der einzige Unterschied besteht darin, dass wir eine Integer-Wrapper-Klasse verwenden. Die Funktionsweise von Integer besteht darin, dass die Laufzeit in Zeile 3 die Summenvariable in eine primitive Ganzzahl konvertieren muss (automatisches Unboxing) und nach Abschluss der Addition das Ergebnis in eine neue Integer-Klasse einschließen muss. (automatische Verpackung). Das bedeutet, dass wir 1 Million Integer-Klassen erstellen und zwei Millionen Paketierungsvorgänge durchführen, was die dramatische Verlangsamung erklärt. Wrapper-Klassen sollten nur verwendet werden, wenn sie in Sammlungen gespeichert werden müssen. Zukünftige Versionen von Java werden jedoch Sammlungen primitiver Typen unterstützen, wodurch Wrapper überflüssig werden.

Wie „final“, „finally“ und „finalize“ in Java verwendet werden

Quelle: Newsshare In diesem Artikel erfahren Sie, wo, wann und warum das Schlüsselwort Finalize verwendet wird und ob sich der Einsatz in Java überhaupt lohnt. Außerdem lernen Sie die Unterschiede zwischen „final“, „finally“ und „finalize“ kennen.

Wo wird ein „finally“-Block verwendet?

Der „finally“-Block in Java wird verwendet, um wichtige Teile des Codes unterzubringen, wie zum Beispiel Bereinigungscode, das Schließen einer Datei oder das Schließen einer Verbindung. Der „finally“-Block wird unabhängig davon ausgeführt, ob eine Ausnahme ausgelöst wird oder ob diese Ausnahme behandelt wird. A schließlich enthält alle wichtigen Aussagen unabhängig davon, ob eine Ausnahme auftritt oder nicht.

Wie finalisiert man eine Variable in Java?

Es gibt drei Möglichkeiten, eine endgültige Java-Variable zu initialisieren:
  • Sie können eine letzte Variable initialisieren, wenn sie deklariert wird. Dieser Ansatz ist der gebräuchlichste.
  • Eine leere Endvariable wird in einem Instanzinitialisiererblock oder Konstruktor initialisiert.
  • Eine leere letzte statische Variable wird innerhalb eines statischen Blocks initialisiert.

Können wir die Finalize-Methode in Java manuell aufrufen?

Die finalize()- Methode ist nicht erforderlich und es wird nicht empfohlen, sie aufzurufen, wenn ein Objekt den Gültigkeitsbereich verlässt. Denn es ist nicht im Voraus bekannt, wann (oder ob) die finalize()- Methode ausgeführt wird . Im Allgemeinen ist finalize nicht die beste Methode, es sei denn, es besteht ein besonderer Bedarf dafür. Ab Java 9 ist es veraltet.

Wann wird die finalize-Methode aufgerufen?

Die finalize()- Methode wird aufgerufen, um unmittelbar vor der Garbage Collection eine Bereinigung durchzuführen.

Was ist der Unterschied zwischen „final“, „finally“ und „finalize“?

Der Hauptunterschied zwischen „final“, „final“ und „finalize“ besteht darin, dass „final“ ein Zugriffsmodifikator, „finally“ ein Block in der Ausnahmebehandlung und „finalize“ eine Methode einer Objektklasse ist.

Ist es möglich, endgültige Methoden zu überschreiben?

Nein, als endgültig deklarierte Methoden können nicht überschrieben oder ausgeblendet werden.

Können wir Try ohne Catch verwenden?

Ja, es ist möglich, einen Try- Block ohne Catch- Block zu haben, indem man einen Final- Block verwendet . Wie wir wissen, wird der letzte Block immer ausgeführt, auch wenn im try-Block eine andere Ausnahme als „System“ auftritt.

Was sind endgültige Methoden?

Endgültige Methoden können nicht von Unterklassen überschrieben oder ausgeblendet werden. Sie werden verwendet, um unerwartetes Verhalten einer Unterklasse zu verhindern, die eine Methode ändert, die für die Funktion oder Konsistenz der Klasse von entscheidender Bedeutung sein kann.

Kann ein Konstruktor endgültig sein?

Konstruktoren können NIEMALS als endgültig deklariert werden. Ihr Compiler gibt immer einen Fehler wie „Endgültiger Modifikator nicht zulässig“ aus. Bei der Anwendung auf Methoden bedeutet „Final“, dass die Methode in einer Unterklasse nicht überschrieben werden kann. Konstruktoren sind KEINE regulären Methoden.

Wofür wird das Schlüsselwort „finally“ verwendet?

Das Schlüsselwort „final“ wird verwendet, um einen Codeblock nach einem try-Block zu erstellen. Der final-Block wird immer ausgeführt, unabhängig davon, ob eine Ausnahme auftritt. Durch die Verwendung eines „final“-Blocks können Sie alle Anweisungen vom Typ „Abwickeln“ ausführen, unabhängig davon, was im geschützten Code geschieht.

Was nützt endlich?

Ein „finally“-Block in Java ist ein Block, der zum Ausführen von Codeteilen wie dem Schließen einer Verbindung usw. verwendet wird. Der final-Block in Java wird immer ausgeführt, unabhängig davon, ob die Ausnahme behandelt wird oder nicht. Daher enthält es alle notwendigen Anweisungen, die gedruckt werden müssen, unabhängig davon, ob eine Ausnahme auftritt oder nicht.

Warum ist die Finalize-Methode geschützt?

Warum ist der Methodenzugriffsmodifikator finalize() geschützt? Warum kann es nicht öffentlich sein? Es ist nicht öffentlich, da es von niemand anderem als der JVM aufgerufen werden sollte. Sie muss jedoch geschützt werden, damit sie von Unterklassen überschrieben werden kann, die ihr Verhalten definieren müssen.

Wird die finalize-Methode in Java immer aufgerufen?

Die finalize-Methode wird aufgerufen, wenn ein Objekt im Garbage Collection-Prozess behandelt werden soll. Dies kann jederzeit passieren, nachdem es für die Garbage Collection infrage kommt. Beachten Sie, dass es durchaus möglich ist, dass das Objekt nie durch Garbage Collection erfasst wird (und finalize daher nie aufgerufen wird).

Was ist der Unterschied zwischen Wurf und Würfen?

Das Schlüsselwort throw wird verwendet, um absichtlich eine Ausnahme auszulösen. Das Schlüsselwort throws wird verwendet, um eine oder mehrere durch Kommas getrennte Ausnahmen zu deklarieren. Bei Verwendung von throw wird nur eine Ausnahme ausgelöst.

Was ist der Unterschied zwischen Try-Catch- und Final-Keywords?

Dabei handelt es sich um zwei unterschiedliche Konzepte: Ein Catch-Block wird nur ausgeführt, wenn im Try-Block eine Ausnahme auftritt. Der final-Block wird immer nach dem try(-catch)-Block ausgeführt, unabhängig davon, ob eine Ausnahme ausgelöst wurde oder nicht.

Können wir es endlich ohne Ausprobieren in Java verwenden?

Ein „final“-Block muss mit einem „try“-Block verknüpft sein. Sie können „final“ nicht ohne einen „try“-Block verwenden. In diesem Block müssen Sie die Anweisungen platzieren, die immer ausgeführt werden müssen.

Können wir die letzte Methode erben?

Wird die endgültige Methode vererbt? Ja, die letzte Methode wird vererbt, aber Sie können sie nicht überschreiben.

Welche Methode kann nicht überschrieben werden?

Wir können statische Methoden nicht überschreiben, da das Überschreiben von Methoden auf dynamischer Verknüpfung zur Laufzeit basiert und statische Methoden zur Kompilierungszeit mithilfe statischer Verknüpfung gebunden werden. Daher ist das Überschreiben statischer Methoden nicht möglich.

Was passiert, wenn die letzte Methode überschrieben wird?

Eine in einer übergeordneten Klasse deklarierte endgültige Methode kann nicht von einer untergeordneten Klasse überschrieben werden. Wenn wir versuchen, die letzte Methode zu überschreiben, löst der Compiler zur Kompilierungszeit eine Ausnahme aus.

Funktionieren das Schlüsselwort final und die Methode finalize gleich?

Es gibt keine Ähnlichkeiten in ihren Funktionen, abgesehen von ähnlichen Namen. Das Schlüsselwort final kann mit einer Klasse, Methode oder Variable in Java verwendet werden. Eine finale Klasse ist in Java nicht erweiterbar, eine finale Methode kann nicht überschrieben werden und eine finale Variable kann nicht geändert werden.

Was ist das Super-Schlüsselwort in Java?

Das Schlüsselwort super in Java ist eine Referenzvariable, die verwendet wird, um auf das unmittelbare Objekt der übergeordneten Klasse zu verweisen. Immer wenn Sie eine Unterklasse instanziieren, wird parallel eine Instanz der übergeordneten Klasse erstellt, auf die durch die Referenzvariable super verwiesen wird. Mit dem Schlüsselwort super kann eine Methode einer übergeordneten Klasse direkt aufgerufen werden.

Was ist der Unterschied zwischen den statischen und finalen Schlüsselwörtern?

Der Hauptunterschied zwischen den Schlüsselwörtern static und final besteht darin, dass das Schlüsselwort static zum Definieren eines Mitglieds einer Klasse verwendet wird, das unabhängig von jedem Objekt dieser Klasse verwendet werden kann. Das Schlüsselwort Final wird verwendet, um eine konstante Variable, eine Methode, die nicht überschrieben werden kann, und eine Klasse zu deklarieren, die nicht vererbt werden kann.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION