statisch ohne Paketnamen importieren

8

Betrachten Sie das folgende einfache Codebeispiel:

%Vor%

Wenn wir versuchen, diesen Code zu kompilieren, erhalten wir die Fehlermeldung:

%Vor%

Dies könnte durch Einführung des statischen Imports von enum :

gelöst werden

import static ... TestStaticImport.Branches.*

Aber in diesem Moment beginnen unverständliche Dinge (für mich):

Diese Lösung funktioniert gut, alles ist gut kompiliert, bis die Klasse TestStaticImport in ein leeres root-Paket verschoben wird, d. h. es gibt keine

package blablabla; am Anfang dieser Java-Datei;

Codezeile: import static TestStaticImport.Branches.*; wird als gültiger Code in meinem Intellij IDEA hervorgehoben (der Name der IDE spielt keine Rolle, nur zur Information), aber wenn ich versuche, solchen Code zu kompilieren, erscheint der folgende Fehler:

java: package TestStaticImport does not exist

Also, es gibt tatsächlich zwei Fragen:

1) Hauptfrage : Warum ist import static aus einem leeren Verzeichnis nicht möglich?

2) Was ist ein anderer Weg (wenn es existiert), um Code-Verweise auf enum-Felder zuzulassen, die nur ihre Namen verwenden (d. h. APPLE anstelle von Branches.APPLE ), außer statischem Import?

P.S. Bitte, sag mir nicht, dass leere Pakete hässlicher Stil sind und so weiter. Diese Frage ist nur ein theoretisches Problem.

    
Andremoniy 10.01.2013, 12:51
quelle

2 Antworten

11

Die Java-Sprachspezifikation verbietet alle Importe aus dem unbenannten Paket:

  

Ein Typ in einem unbenannten Paket (§7.4.2) hat keinen kanonischen Namen, also der   Voraussetzung für einen kanonischen Namen in jeder Art von Import-Deklaration   impliziert, dass (a) Typen in einem unbenannten Paket nicht importiert werden können, und   (b) Statische Elemente von Typen in einem unbenannten Paket können nicht importiert werden.   Daher benötigen §7.5.1, §7.5.2, §7.5.3 und §7.5.4 alle eine Kompilierzeit   Fehler bei jedem Versuch, einen Typ (oder ein statisches Element davon) in ein Verzeichnis zu importieren   unbenanntes Paket.

    
McDowell 10.01.2013, 12:55
quelle
5

In früheren Zeiten mussten die Java-Erfinder Java-Typen zu Dateien zuordnen, damit der Compiler echte Arbeit leisten konnte. Sie beschlossen, Pakete zu Ordnern und Typen zu Dateien zuzuordnen. Das hat ziemlich gut funktioniert. Es stellt vor allem den emotionalen Hintergrund für Newcomer dar: "Ich hasse dich. Leg dich nicht mit mir an." Aber ich schweife ab.

Das Standardpaket ist jedoch ein Problem, da es keinen gut definierten Ordner gibt. Wenn Sie das Paket com haben, wissen Sie, dass es irgendwo einen Ordner com gibt, aber wie lautet der Name des Ordners für das Standardpaket?

Also entschieden die Designer, dass import und Standardpaket nicht gemischt werden. Tatsächlich erhalten Sie einen Fehler, wenn Sie versuchen, etwas zu importieren, das kein Paket enthält (also import TestStaticImport ohne static und * würde ebenfalls fehlschlagen). Siehe So importieren Sie eine Klasse aus dem Standardpaket

>

Das Problem ist also nicht der statische Import, sondern dass Sie versuchen, aus dem Standard-Paket zu importieren.

Wie bei einigen anderen Fällen in Java gibt es keine Lösung.

Siehe auch: In Java -" Statische Member des Standardpakets können nicht importiert werden "- Kann jemand diese Aussage erklären?

    
Aaron Digulla 10.01.2013 13:00
quelle

Tags und Links