2016-04-09 18 views
1

edit: Ich habe Eclipse immer nur zum Programmieren von Java verwendet, daher hängt alles Folgende (und all mein Wissen über Java) davon ab, wie Java in dieser Umgebung programmiert ist.Vererbung und Sichtbarkeit über Projekte hinweg

Ich habe zwei Eclipse-Projekte: Projekt Ein mit Klasse X und Projekt B mit Klasse Y. Class Y aus Projekt B erstreckt Klasse X vom Projekt A.

public class Y extends X // In short B is dependent on Project A 

Klasse X ist public und es hat eine verschachtelte Klasse O.

public class X { 

    class O { // default access modifier 

    } 
} 

In meinem Setup, Klasse Y kann O so lange instanziiert als O nicht private ist. Bedeutung, auch wenn O hat einen Standardzugriffsmodifikator, Y kann immer noch zugreifen O Mitglieder und Variablen. Das ist verwirrend für mich, weil ich dachte, Standardklassen bedeuteten, dass fremde Klassen nur dann Zugriff darauf hätten, wenn sie ein gemeinsames Paket hätten.

Also die Schlussfolgerung, die ich daraus erhalte, ist, dass das Standardpaket in jedem Projekt gleich oder in irgendeiner Weise verbunden sein muss. Habe ich recht, wenn ich das denke? Und wenn das zutrifft, werden Änderungen, die im Paket eines Projekts gemacht werden, auf dem Paket in dem anderen reflektiert?

Und das stellt das Hauptproblem dar, mit dem ich mich beschäftige. Ich möchte den Zugang zu Klasse steuern O, so dass in meinem Beispiel, ich will Y-nicht der Lage sein, O zu instanziiert. Ich kann das jetzt nur tun, indem ich die Sichtbarkeit von O auf privat setze, aber dies schränkt auch andere Klassen desselben Projekts (Projekt A) davon ab, auf O zuzugreifen. Ich will Klasse Y von Projekt B (was ich dachte, hatte ein anderes Paket von Projekt A) nicht Lage seiner O zuzugreifen, aber eine andere beliebige Klasse aus dem selben Projekt als Y/O zu haben Zugang zu O ohne Probleme. Wie kann ich das machen?

+1

Vorsicht, es gibt kein Projektkonzept in der Sprache Java. Sichtbarkeit gilt, soweit Pakete. – Savior

+0

Oh, ich verweise auf Eclipse speziell – Manuel

+0

Sie können nicht von Fall zu Fall Einschränkung der Sichtbarkeit. Der Standardzugriffsmodifikator gibt Klassen im selben Paket Zugriff; Wenn Sie möchten, dass _Y_ nicht auf _O_ zugreifen kann, ziehen Sie in Betracht, _Y_ in ein anderes Paket zu verschieben. – Jire

Antwort

1

Ein paar verschiedene Fragen hier, also werde ich sie aufzählen und individuell beantworten. Außerdem nehme ich an, dass Sie sich durch Projekt auf etwas wie ein Projekt in Eclipse beziehen.

  1. Bin ich richtig, wenn ich das denke?

    Korrekt, wenn Sie mehrere Projekte haben (z.JAR-Dateibuild-Artefakt-Eclipse-Projekte), jeweils mit einem Standardpaket (z. B. src/main/java/Foo.java in zwei Projekten) Standardbereich (d. H. package-private) Klassen können einander und ihre jeweiligen öffentlichen, geschützten und paketprivaten Methoden und Felder sehen.

  2. Und wenn das stimmt, werden Änderungen, die im Paket eines Projekts gemacht werden, auf dem Paket im anderen reflektiert?

    Korrekt, vorausgesetzt, dass die changes of the upstream project are visible to the downstream project.

  3. Wie kann ich das tun?

    Genau genommen können Sie nicht, es sei denn, wie Sie sagten, Sie machen es privat. Und selbst dann können Sie es umgehen. Sie können jedoch aussagekräftige Pakethierarchien auswählen, die andere Programmierer wahrscheinlich nicht verwenden. Zum Beispiel sind Namen wie com.acme.myproject.subfolder aus diesem Grund üblich. Aber jemand könnte trotzdem einen parallelen Ordner in seinem eigenen Projekt erstellen und Ihre Paket-privaten Klassen aufrufen. Das heißt, für private Mitglieder Klassen, könnten sie change the accessibility of that member, um Sie zu umgehen. Während das erschreckend klingen mag, wenn Sie wirklich sicheren Code wollen, sollten Sie eine sichere Autorisierung für Remote-Dienste wirklich verwenden. Der Zweck, etwas package-private zu machen, ist prevent it from being part of your API, anstatt einige echte Sicherheit zu erzwingen. Tatsächlich ist dieses Verhalten oft wünschenswert. Angenommen, ich habe eine Paket-Privat-Klasse unter src/main/java/com/acme/myproj/Foo.java, die ich als Unit-Test testen möchte. Die Klasse Foo ist package-privat, weil ich sie nicht Teil meiner öffentlichen API machen möchte. Also, ich kann einfach src/test/java/com/acme/myproj/FooTest.java erstellen und voila, ich kann jetzt unit tests against my package-private classFoo ausführen.

Ich hoffe, dass die Dinge erklärt.

Verwandte Themen