595 Stimmen

Warum ist die Verwendung eines Platzhalters in einer Java-Import-Anweisung schlecht?

Es ist viel bequemer und sauberer, eine einzige Anweisung zu verwenden wie

import java.awt.*;

als eine Reihe von einzelnen Klassen zu importieren

import java.awt.Panel;
import java.awt.Graphics;
import java.awt.Canvas;
...

Was ist falsch an der Verwendung eines Platzhalters in der import Aussage?

5voto

Milan Paudyal Punkte 451

Hier sind die wenigen Dinge, die ich zu diesem Thema gefunden habe.

  • Während der Kompilierung versucht der Compiler, Klassen zu finden, die im Code aus dem .*-Import verwendet werden, und der entsprechende Bytecode wird durch Auswahl der verwendeten Klassen aus dem .*-Import erzeugt. Somit ist der Bytecode bei der Verwendung von .*-Import oder .class-Namen-Import gleich und die Laufzeitleistung ist aufgrund des gleichen Bytecodes ebenfalls gleich.

  • Bei jeder Kompilierung muss der Compiler alle Klassen des .*-Pakets durchsuchen, um die Klassen zu finden, die tatsächlich im Code verwendet werden. Daher benötigt Code mit .*-Import während des Kompilierungsprozesses mehr Zeit als bei der Verwendung von .class name-Importen.

  • Die Verwendung von .* import hilft, den Code sauberer zu gestalten

  • Die Verwendung von .*-Import kann zu Mehrdeutigkeiten führen, wenn wir zwei gleichnamige Klassen aus zwei verschiedenen Paketen verwenden. Beispiel: Date ist in beiden Paketen verfügbar.

      import java.util.*;
      import java.sql.*;
    
      public class DateDemo {
          private Date utilDate;
          private Date sqlDate;
      }

3voto

Afee Punkte 2639

Die wichtigste ist, dass der Import von java.awt.* kann Ihr Programm mit einer zukünftigen Java-Version inkompatibel machen:

Angenommen, Sie haben eine Klasse mit dem Namen "ABC", Sie verwenden JDK 8 und importieren java.util.* . Nehmen wir nun an, dass Java 9 herauskommt und eine neue Klasse im Paket java.util die zufälligerweise auch "ABC" heißt. Ihr Programm wird nun unter Java 9 nicht kompiliert, weil der Compiler nicht weiß, ob Sie mit dem Namen "ABC" Ihre eigene Klasse oder die neue Klasse in java.awt .

Sie werden dieses Problem nicht haben, wenn Sie nur die Klassen importieren, die explizit von java.awt die Sie tatsächlich nutzen.

Ressourcen:

Java-Importe

2voto

user109439 Punkte 29

Unter all den stichhaltigen Argumenten, die auf beiden Seiten vorgebracht wurden, habe ich keinen Hauptgrund gefunden, die Wildcard zu vermeiden: Ich möchte in der Lage sein, den Code zu lesen und direkt zu wissen, was jede Klasse ist, oder wenn ihre Definition nicht in der Sprache oder der Datei enthalten ist, wo sie zu finden ist. Wenn mehr als ein Paket mit * importiert wird, muss ich jedes einzelne Paket durchsuchen, um eine Klasse zu finden, die ich nicht kenne. Lesbarkeit ist das Wichtigste, und ich stimme zu, dass Code nicht erfordern eine IDE zum Lesen des Dokuments.

2voto

magallanes Punkte 6033

Für das Protokoll: Wenn Sie einen Import hinzufügen, geben Sie auch Ihre Abhängigkeiten an.

Sie können schnell sehen, welche Abhängigkeiten von Dateien bestehen (mit Ausnahme von Klassen desselben Namensraums).

1voto

Leon Punkte 2856
  • Dies hat keine Auswirkungen auf die Laufzeit, da der Compiler die * automatisch durch konkrete Klassennamen ersetzt. Wenn Sie die .class-Datei dekompilieren, werden Sie niemals import ...* .

  • C# immer verwendet * (implizit), da man nur using Paketname. Sie können den Klassennamen überhaupt nicht angeben. Java führt die Funktion nach c# ein. (Java ist in vielerlei Hinsicht sehr kompliziert, aber das geht über dieses Thema hinaus).

  • Wenn Sie in Intellij Idea die Funktion "Importe organisieren" verwenden, werden mehrere Importe desselben Pakets automatisch durch * ersetzt. Dies ist eine obligatorische Funktion, die Sie nicht abschalten können (obwohl Sie den Schwellenwert erhöhen können).

  • Der in der akzeptierten Antwort aufgeführte Fall ist nicht gültig. Ohne * haben Sie immer noch das gleiche Problem. Sie müssen den Namen des Pakets in Ihrem Code angeben, egal ob Sie * verwenden oder nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X