Warum sind Dateinamen in Java die gleichen wie der öffentliche Klassenname? [closed]

Lesezeit: 7 Minuten

Warum sind Dateinamen in Java die gleichen wie der offentliche
Gewitter

In Java sollte der Name der Datei mit dem Namen der public class in dieser Datei enthalten. Warum ist das eine Einschränkung? Welchem ​​Zweck dient es?

  • Diese Frage sollte umformuliert werden: Warum sollte eine Sprache es absichtlich schwieriger machen, Ihre Quelle für absolut keinen Nutzen zu finden, indem sie willkürliche Datei-/Klassenbenennungskonflikte zulässt?

    – Bill K

    25. Januar 2010 um 19:06 Uhr

1647258431 34 Warum sind Dateinamen in Java die gleichen wie der offentliche
Bill K

Java hatte einen interessanten Ansatz: Wo einem Programmierer eine Wahlmöglichkeit zu geben, die Programmiererfahrung nur verschlechtern kann, entfernen Sie die Wahlmöglichkeit.

Das taten sie an vielen Stellen. Dateinamen und Pakete sicher, aber auch nicht mehrere öffentliche Klassen in einer Datei zulassen (nie gut), nicht zulassen, dass Sie Klassen zwischen Dateien aufteilen (verdammt schwer damit zu arbeiten!) usw.

Ich wünschte wirklich, sie wären ein paar weiter gegangen. Es gibt keinen Grund für öffentliche Variablen: Ich habe noch nie eine benötigt, noch habe ich jemals eine Situation gesehen, in der ein kluger Programmierer dachte, dass eine benötigt wird, und tatsächlich Recht hatte.

Ich hätte auch nichts dagegen, Einschränkungen der Methoden- / Klassengröße zu sehen, aber dies könnte skizzenhaft werden (es könnte leicht von Codeprüfern implementiert werden, das Problem besteht normalerweise darin, dass die Unternehmen, die die meiste Hilfe benötigen, diejenigen sind, die nicht wissen, dass sie es brauchen Hilfe und verwenden Sie daher keine Tools wie Code-Checker).

Dies ist für die meisten kleinen Teams nicht wichtig, aber wenn Ihr Team wächst und mehrere Standorte mit Beratern aus Indien, China und verschiedenen anderen Orten auf der ganzen Welt hat, werden Sie die Inflexibilität zu schätzen wissen.


Als Antwort auf den Kommentar der Setter/Getter:

Java Beans waren ein Greuel, der von Borland geschaffen wurde, um ihre GUI zu hacken, und dann in Java nachgerüstet wurde.

Schreckliche Idee – eine Ablenkung von der OO-Programmierung – Getter und Setter A) zeigen zu viel von Ihrer Implementierung und B) lassen Sie an Daten von einem anderen Objekt denken, anstatt das andere Objekt zu bitten, eine Operation für Sie auszuführen. Schlechter Hack für Leute, die noch nicht in OO denken können.

Getter werden gelegentlich benötigt, sollten aber nicht hinzugefügt werden, es sei denn, es ist absolut unvermeidbar.

Setter sollten um jeden Preis vermieden werden. Wenn Sie den Status unbedingt extern ändern müssen, nachdem ein Objekt erstellt wurde, versuchen Sie, das Builder-Muster zu verwenden und Ihre Setter davor zu schützen, aufgerufen zu werden, nachdem eine Operation ausgeführt wurde.

Es gibt offensichtlich Ausnahmen von allem, und viele “Getter” sind tatsächlich kritische Objekt-Geschäftslogik, wie String.length(), die unabhängig davon erforderlich wäre, wie String implementiert wurde, und nicht einmal implementiert wird, indem nur eine Eigenschaft zurückgegeben wird – eine großartige Fall für einen “Getter”, wenn man es überhaupt so nennen will.

  • Das getX/setX-Paradigma wurde noch nicht eingeführt, als Java entworfen wurde. Ich glaube, dass dies das Ergebnis davon ist, dass JavaBeans Schnittstellen codieren müssen, und Sie können keine öffentlichen Variablen in einer Schnittstelle haben.

    – Thorbjørn Ravn Andersen

    25. Januar 2010 um 19:42 Uhr

  • Ich wünschte, Java würde dies auch für nicht-öffentliche Klassen erzwingen.

    – sternenblau

    25. Januar 2010 um 20:14 Uhr

  • Es gibt tatsächlich Größenbeschränkungen für Klassen und Methoden, sie sind einfach so groß, dass Sie ihnen in der Praxis nicht begegnen.

    – Antimon

    28. Juni 2013 um 4:59 Uhr

  • Öffentliche Variablen können nützlich sein, wenn die Klasse tatsächlich eine verherrlichte Struktur ist und nur öffentliche (und sinnlose) Getter und Setter haben würde

    – Richard Tingle

    14. Juli 2013 um 10:14 Uhr

  • Obwohl Sie in der Praxis genau richtig sind, ist es gelegentlich wirklich nützlich, theoretisch wäre das schreckliches OO und sollte nicht getan werden. Ich habe es ein paar Mal so gemacht, aber nur als Hack und normalerweise endet es damit, dass ich es später herausreiße. Die Tatsache, dass Sie öffentliche Variablen haben können, schadet Ihrem Code also nur, und ich denke, ich bleibe bei meiner Aussage, dass sie nicht existieren sollten. Eine Klasse nur mit Settern und Gettern ODER eine Klasse mit öffentlichen Variablen ist ein wirklich schreckliches Muster.

    – Bill K

    16. Juli 2013 um 6:10 Uhr


Ich wollte gerade sagen, dass es einfach ein Muss. Aber ich habe mir die angeschaut JLS, und es ist nicht so streng. Aus Sicht des JLS bleibt es dem Compiler überlassen, ob er eine solche Einschränkung setzt oder nicht.

Praktisch gesprochen – gängige Compiler haben diese Einschränkung, und wie bereits erläutert, ist es für den Compiler viel einfacher, eine Kompilierungseinheit zu finden, oder für einen Klassenlader, eine Klassendatei mit einer solchen Einschränkung zu finden.

  • Was die Sprachspezifikation betrifft, muss der Quellcode nicht einmal in Dateien enthalten sein. Es ist eine Konvention für Compiler, die Quellcode in Dateien handhaben.

    – Tom Hawtin – Angelleine

    25. Januar 2010 um 19:27 Uhr

1647258431 859 Warum sind Dateinamen in Java die gleichen wie der offentliche
GuruKulki

Genauer gesagt, die Dateiname sollte den gleichen Namen wie die haben öffentlicher Klassenname in dieser Datei, um der JVM mitzuteilen, dass dies der Einstiegspunkt für Sie ist.

  • Tatsächlich ist der Einstiegspunkt im JAR-Manifest angegeben. Es hat nichts mit der Anordnung von Quelldateien auf Java-Ebene zu tun.

    – Antimon

    28. Juni 2013 um 5:02 Uhr

  • @Antimony, dies ist der Fall, wenn Sie die einzelne Java-Datei ausführen müssen. Und selbst der Einstiegspunkt, den Sie im Manifest erwähnen, sollte dieselbe Namenskonvention haben.

    – GuruKulki

    28. Juni 2013 um 8:56 Uhr

  • Das hat nichts mit dem Einstiegspunkt zu tun. Sie können eine Nicht-public Klasse gerufen Foo in einer Datei namens Bar.javakompilieren Sie es und führen Sie es über aus java Foo. Die java tool kümmert sich nicht darum, ob die Klasse ist public, und bestimmt den Einstiegspunkt anhand des Klassennamens, den Sie ihm gegeben haben, nicht des Namens der Quelldatei (der nicht einmal im Klassen-Bytecode enthalten ist, wenn Sie Debug-Informationen deaktivieren). Andere Startups (die ein JAR ausführen, Servlets) bestimmen den Einstiegspunkt ebenfalls auf andere Weise, nicht durch den Quelldateinamen.

    – TJ Crowder

    6. Juli 2018 um 11:40 Uhr


Warum sind Dateinamen in Java die gleichen wie der offentliche
BlueRaja – Danny Pflughöft

Es ist nur Das Treffen Set von Sun, den Machern von Java.
Der Zweck ist die Organisation; Der Grund dafür ist, dass jeder, der in Java kodiert, eine einheitliche Art hat, Dateien zu benennen.

Warum sind Dateinamen in Java die gleichen wie der offentliche
phisch

Jede öffentliche Klasse muss sich in einer Datei befinden, in der der Dateiname mit dem Klassennamen übereinstimmt, und in einem Paket, in dem der Paketname die Verzeichnisstruktur darstellt, geschrieben in gepunkteter Form (Schrägstriche werden zu Punkten, wie com/example/app zu com.example.app).

Diese Konvention ist nicht zufällig. Der Compiler muss in der Lage sein, die Quelldateien zu finden, und der Klassenlader muss in der Lage sein, die Implementierung zu finden. Das Anpassen von Paketnamen und Klassennamen macht dies wirklich einfach und, was noch wichtiger ist, schnell.

Diese Konvention gilt nicht für nicht-öffentliche Klassen. Dies liegt daran, dass nicht-öffentliche Klassen eine sehr eingeschränkte Sichtbarkeit haben und nur innerhalb des Pakets verwendet werden können, in dem sie definiert sind. Somit haben der Compiler und die Laufzeitumgebung in beiden Fällen bereits die richtigen Dateien gefunden.

  • Nicht-öffentliche Klassen mit Standardzugriff (“Paket privat”) können überall innerhalb desselben Pakets verwendet werden.

    – Tom Hawtin – Angelleine

    25. Januar 2010 um 19:28 Uhr

  • Ja, das war tatsächlich ein Tippfehler. Sie können innerhalb des Pakets verwendet werden, aber nirgendwo anders. Private Klassen können nur innerhalb der Datei verwendet werden, in der sie definiert wurden

    – Phisch

    25. Januar 2010 um 19:40 Uhr


1647258432 760 Warum sind Dateinamen in Java die gleichen wie der offentliche
Vivek

Es ist nützlich, um die Klasse zu finden. Angenommen, unterschiedliche Dateinamen sind zulässig, und wenn Sie eine Instanz einer Klasse erstellt haben, muss der Compiler stattdessen die Klasse in allen Dateien suchen, wenn die Dateinamen mit denen der Klasse identisch sind, die Leistung beim Auffinden und Verwenden der Klasse ist ist gestiegen. Das können auch andere Gründe sein.

  • Nicht-öffentliche Klassen mit Standardzugriff (“Paket privat”) können überall innerhalb desselben Pakets verwendet werden.

    – Tom Hawtin – Angelleine

    25. Januar 2010 um 19:28 Uhr

  • Ja, das war tatsächlich ein Tippfehler. Sie können innerhalb des Pakets verwendet werden, aber nirgendwo anders. Private Klassen können nur innerhalb der Datei verwendet werden, in der sie definiert wurden

    – Phisch

    25. Januar 2010 um 19:40 Uhr


1647258433 717 Warum sind Dateinamen in Java die gleichen wie der offentliche
Venkataswamy

Solange es nicht öffentlich ist eine Klasse kann einen anderen Namen als ihren Dateinamen haben. Die Klasse kann auch eine Hauptmethode haben. Die Klassendatei wird mit dem Klassennamen, aber nicht mit dem Quelldateinamen generiert. Der Klassenname sollte verwendet werden, um es auszuführen.

Grund ist: Die Standardklasse ist ein privates Paket, daher muss Javac diese Quelldatei nicht finden, um ein anderes Java-Programm von außerhalb des Pakets zu kompilieren.

  • Falsch. Es gibt auch andere Einschränkungen; siehe JLS 7.6.

    – Stefan C

    22. Februar 2018 um 4:41 Uhr

1001380cookie-checkWarum sind Dateinamen in Java die gleichen wie der öffentliche Klassenname? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy