Sichtbarkeit von Klassen und gute Architektur

Usul

Mitglied
Hallo,

ich habe Erfahrung mit C# und dort gibt es den praktischen modifier internal für Klassen. Wenn eine Klasse diesen Modifier besitzt, so ist sie innerhalb des Assemblies (ein Assembly entspricht einer JAR oder einer DLL) public aber nicht von aussen sichtbar (also Code, welcher dieses Assembly importiert kann diese Klasse nicht sehen). Bei Java gibt es das ja nicht, hier gibts nur entweder alle oder nur ein einzelnes package.

Wie kann man damit aber nun schöne Bibliotheken erstellen? Angenommen ich schreibe Code, welcher später von anderen Java-Projekten genutzt werden soll. Diese sollen aber nur die öffentlichen Klassen (oder Interfaces) sehen, was ja gutes Design ist. Allerdings möchte ich meinen Code ja schon in verschiedenen Packages struktieren und nicht alles in ein Package quetschen, da das schlechtes Design ist. In C# ist dies kein Problem aber in Java scheinen diese beiden Anforderungen sich zu beissen. Wie ist hier die Standard-Vorgehensweise?

Beispiel:
package foo: AClass, SomeFacade
package bar BClass

SomeFacade soll jetzt nach aussen sichtbar sein und ist somit public (das ist ja kein Problem). AClass und BClass sollen jedoch nicht sichtbar sein, aber AClass soll BClass kennen. In Java nicht möglich.


Vielen Dan
 

MQue

Top Contributor
Generell sollte man Module/Komponenten/Bundles mit hoher Kohäsion und looser Kopplung programmieren -> dein Design wiederspricht dem.
Alles was zusammen gehört, sollte man in einem Modul bündeln dann hat man eine hohe Kohösion.
Aber du hast recht, dass ist mir auch unbekannt, wie man das machen kann, ohne dass ein weiteres Interface nach außen sichtbar ist -> aber wie geasgt, das Design so wählen, dass das gar nicht notwendig ist.
In OSGi ist es z.B.: üblich, dass man ein package für die Implementierung hat und ein Package, in dem man die Schnittstellen (Interfaces) für dieses Package bereitstellt und die Implementierungs- Packages haben untereinander nichts miteinander zu tun -> das ist ein Standard von OSGi
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
OSGi ist das richtige Stichwort. Statte deine Bibliothek mit einem OSGi Manifest aus, dort ist explizit vermerkt welche Packages öffentlich sind und welche nicht.
In einer IDE werden diese Informationen zur Compilezeit auch ausgewertet und in einem OSGi Framework zur Laufzeit. Bei Plain Java Projekten ohne passende IDE hast du deine intentionen dann wenigstens im Manifest klargemacht, wer sich nicht daran hält braucht sich später nicht zu wundern wenn der non-public Teil nicht abwärtskompatibel ist.
Generell würde ich empfehlen jede Art von Library mit OSGi kompatiblem Manifest auszuliefern
 

Usul

Mitglied
Generell sollte man Module/Komponenten/Bundles mit hoher Kohäsion und looser Kopplung programmieren -> dein Design wiederspricht dem.
Alles was zusammen gehört, sollte man in einem Modul bündeln dann hat man eine hohe Kohösion.
Aber du hast recht, dass ist mir auch unbekannt, wie man das machen kann, ohne dass ein weiteres Interface nach außen sichtbar ist -> aber wie geasgt, das Design so wählen, dass das gar nicht notwendig ist.
In OSGi ist es z.B.: üblich, dass man ein package für die Implementierung hat und ein Package, in dem man die Schnittstellen (Interfaces) für dieses Package bereitstellt und die Implementierungs- Packages haben untereinander nichts miteinander zu tun -> das ist ein Standard von OSGi

Mir ist das Prinzip mit high cohesion low coupling bekannt und auch OSGi kenne ich. Aber Module haben nichts mit packages zu tun. Ein Modul/Komponente ist nicht ein package. Packages sollten der Strukturierung dienen. Alles in eine Art Gott-package zu packen ist wie wenn man auf Klassen-Ebene eine Gott-Klasse hat. Ein Modul sollte intern in mehrere packages strukturierbar sein, ohne dass damit gleich alles extern öffentlich ist.

Letztendlich hat man durch OOP gelernt, dass Kapselung sinnvoll ist. Nun muss man dieses Prinzip von der Klassen-Ebene auch auf die "Modul" (JAR)-Ebene übertragen.

Und ja mit OSGi ist das natürlich möglich. Allerdings ist die Bibliothek dann vom Framework abhängig. Man hat somit ein OSGi-Plugin welches nur mit OSGi funktioniert. Das würde ich aber gerne vermeiden.

Ich habe allerdings Hoffnung auf Java 1.7. Denn wie es aussieht ist man sich dem Problem bewusst und es wird ein Konzept namens Superpackages engeführt (Super Packages in Java 7.0). Das ist im Prinzip genau das für Java, was bis jetzt nur mit Frameworks wie OSGi möglich ist.
 
M

maki

Gast
Aber Module haben nichts mit packages zu tun.
Doch natürlich, zB: Modul A braucht Package a.b.c
Wenn man Module von Modulen abhängig macht, ist man gar nicht so flexibel, packages sind da eine bessere weil flexiblere Lösung -> Module müssen sich nicht gegenseitig kennen

Ein Modul sollte intern in mehrere packages strukturierbar sein, ohne dass damit gleich alles extern öffentlich ist.
Genau das bietet OSGi.

Letztendlich hat man durch OOP gelernt, dass Kapselung sinnvoll ist. Nun muss man dieses Prinzip von der Klassen-Ebene auch auf die "Modul" (JAR)-Ebene übertragen.
s.o., genau das bietet OSGi

Und ja mit OSGi ist das natürlich möglich. Allerdings ist die Bibliothek dann vom Framework abhängig. Man hat somit ein OSGi-Plugin welches nur mit OSGi funktioniert. Das würde ich aber gerne vermeiden.
Siehe Wildcards post, solange du keine OSGi API benutzt läuft deine Jar auch ohne OSGi Plattform.

Ich habe allerdings Hoffnung auf Java 1.7. Denn wie es aussieht ist man sich dem Problem bewusst und es wird ein Konzept namens Superpackages engeführt (Super Packages in Java 7.0). Das ist im Prinzip genau das für Java, was bis jetzt nur mit Frameworks wie OSGi möglich ist.
IMHO ist das kommende Java Modul System leider nur ein verstümmelter Abklatsch eines echten Modulsystems wie OSGi...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Sichtbarkeit bei Supplier Allgemeine Java-Themen 10
S Frage zu Threads (Sichtbarkeit und Verhalten) Allgemeine Java-Themen 11
G Thread variablen Sichtbarkeit Allgemeine Java-Themen 15
V Paketdiagramm / Sichtbarkeit Allgemeine Java-Themen 3
H2SO3- sichtbarkeit in verschiedenen paketen Allgemeine Java-Themen 2
M Sichtbarkeit - Standart Allgemeine Java-Themen 8
B Frage zu Sichtbarkeit in (Unter)Paketen Allgemeine Java-Themen 9
MQue Sichtbarkeit/HashMap/NullPointerexception Allgemeine Java-Themen 2
E Sichtbarkeit eines Objekts Allgemeine Java-Themen 4
L Sichtbarkeit von Variablen / getMethode Allgemeine Java-Themen 4
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
Zrebna Wie ermittelt man alle testbaren (zu testenden) Klassen in seinem Maven-Projekt? Allgemeine Java-Themen 23
8u3631984 Jacoco Testcoverage bei Abstracten Klassen in verschachtelten Modulen Allgemeine Java-Themen 6
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
B Wie kann ich mein 8 Klassen Gebilde objektorientierter schreiben? Allgemeine Java-Themen 114
N abstracte klassen methoden Allgemeine Java-Themen 32
W Klassen Zugriff auf ein Textfile aus allen Klassen. Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
M Kann man Annotationen auf Klassen einschränken die ein Interface implementieren? Allgemeine Java-Themen 1
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
L Classpath Zur Laufzeit bestimmte Klassen in Classloader hinzufügen? Allgemeine Java-Themen 4
P Abstrakte Klassen vs. Interface Allgemeine Java-Themen 4
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
B Problem mit meinen Klassen Allgemeine Java-Themen 6
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
F ArrayList`s in Klassen mit Getter/Setter Allgemeine Java-Themen 8
F Code in Klassen bringen Allgemeine Java-Themen 4
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
F Klassen Verwendung abstrakter Klassen Allgemeine Java-Themen 9
W Variablenübergabe über mehrere Klassen Allgemeine Java-Themen 4
B Vererbung Interface und implementierende Klassen Allgemeine Java-Themen 8
D Klassen JLabels in anderen Klassen verwenden. Allgemeine Java-Themen 7
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
A Anonyme Klassen - Interface Allgemeine Java-Themen 5
ReinerCoder auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
J Tetris Probleme bei Klassen Allgemeine Java-Themen 14
cool_brivk24 Klassen Klassen Aufruf Fehlgeschlagen Allgemeine Java-Themen 14
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
S Klassen Abstrakte Klassen Allgemeine Java-Themen 5
T Log4J - Deaktivierung für einzelne Klassen Allgemeine Java-Themen 7
Tommy Nightmare Klassen Globale Klassen erstellen Allgemeine Java-Themen 7
X Klassen aus jar in jar Laden Allgemeine Java-Themen 1
S Klassen Klassen "virtuell" erstellen Allgemeine Java-Themen 5
J Aus mehreren Klassen ein Datei ausführbare machen Allgemeine Java-Themen 6
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
Sin137 Struktur der Klassen & Package Allgemeine Java-Themen 2
G Klassen und interne Klassen Allgemeine Java-Themen 1
S Klassen übergeben Allgemeine Java-Themen 13
C Klassen und Konstruktor Allgemeine Java-Themen 2
S Classpath Wie kann ich Java-Library Klassen "verstecken"..? Allgemeine Java-Themen 4
A Java speech - 2 Klassen Allgemeine Java-Themen 1
V Wie kann ich die Fragen mit den anderen Klassen verbinden? Allgemeine Java-Themen 1
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
V Klassenname von allen Klassen mit einer bestimmten Eigenschaft bekommen Allgemeine Java-Themen 2
B Classpath Eclipse findet importierte Klassen nicht Allgemeine Java-Themen 1
C DBConnection als Methode in mehreren Klassen Allgemeine Java-Themen 4
C Arten von Klassen Allgemeine Java-Themen 3
7 Verbinden von Mehreren Klassen Allgemeine Java-Themen 29
A Klassen ein Interface aufzwingen Allgemeine Java-Themen 4
O Java-Obfuscator, welcher einzelne Methoden, Klassen und Ordnerstrukturen ausnehmen kann. Allgemeine Java-Themen 1
A also definition von klassen und string methoden und algorithmik Allgemeine Java-Themen 13
D Problem bei Vererbung abstrakter Klassen Allgemeine Java-Themen 6
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
X Eigene Annotation - mit Bedingung für ganze Klassen oder Methoden Allgemeine Java-Themen 2
O Klassen Programm in Klassen unterteilt, werte werden nicht mehr übernommen Allgemeine Java-Themen 3
J C++ Projekt (QT) in Java mit Klassen (nicht imperativ) nutzen (BridJ? JavaCPP? SWIG? JNA? JNI?) Allgemeine Java-Themen 2
T Datentypen Eine Liste - verschiedenen Klassen - eine Abstracte Klasse Allgemeine Java-Themen 3
S .jar hat nicht alle Klassen ??? Allgemeine Java-Themen 10
S Polymorphie Polymorphismus bei Abstrakten Klassen Allgemeine Java-Themen 2
S Tool um mehrere Klassen in einer Klasse vereinen? Allgemeine Java-Themen 6
T Wie kann ich alle existierenden Java-Klassen anzeigen lassen? Allgemeine Java-Themen 10
Landei Welche Klassen fehlen im JDK? Allgemeine Java-Themen 18
S Kapselung Statische Helper Klassen Allgemeine Java-Themen 5
A Vererbung Klassen-Downcasting wirft ClassCastException Allgemeine Java-Themen 2
N Java Klassen mit ID Allgemeine Java-Themen 21
antonbracke Klassen Klassen gegenseitig laden Allgemeine Java-Themen 4
R SecurityManager für einzelne Klassen/Threads? Allgemeine Java-Themen 38
T Java Klassen aus externer .jar laden und ausführen Allgemeine Java-Themen 3
S JPA und Entity-Klassen: Wert ungültig Allgemeine Java-Themen 6
M OO / Klassen / Projektstruktur Allgemeine Java-Themen 5
O Klassen werden nicht importiert Allgemeine Java-Themen 3
E selber Klassen kompilieren/ prüfen Allgemeine Java-Themen 5
Z Abstrakte Klassen /Interface Allgemeine Java-Themen 5
A Klassen und JLabel's Allgemeine Java-Themen 12
J Java-Implementierung diverser Beziehungen zwischen Klassen bzw. Objekten Allgemeine Java-Themen 2
M Methoden/Klassen für andere Projekte Allgemeine Java-Themen 4
J Suche: Tool zum Auffinden gleichnamiger Klassen (Name und Package gleich) in unteschiedlichen JARs Allgemeine Java-Themen 5
E instanceof mit nicht öffentlichen Klassen Allgemeine Java-Themen 2
D Datentypen Typbestimmung unbekannter Wrapper-Klassen Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben