Zugriff auf Klasse

Status
Nicht offen für weitere Antworten.

sirair

Aktives Mitglied
Hallo,

ich möchte gewährleisten, dass nur von einer bestimmten Klasse ein Konstruktor der anderen Klasse aufgerufen werden kann.
z.B.

[Java]
public class Techniker(){
}

public class Werkstatt(){
public Techniker getTechniker(){
return new Techniker();
}
}
[/Java]

Soll von einer anderen Klasse ein Objekt der Klasse Techniker erzeugt werden, so muss getTechniker() der Klasse Werkstatt aufgerufen werden. Wie ist sowas zu realisieren?
 
Die Klasse Techniker protected machen und zusammen mit der Klasse Werkstatt in ein eigenes Package stecken. Alle andere Klassen in andere Packages. protected = Sichtbar im selben Package.

edit: Huch das geht ja gar nicht direkt für ne Klasse. Aber du kannst den Konstruktor zumindest protected machen.

@profis: Wieso ist protected eig. nicht möglich für Klassen? Also wäre doch leichter wenn man will das ALLES protected ist in der Klasse. So muss man das überall dazu schreiben.
 
Zuletzt bearbeitet:
Die Klasse Techniker protected machen und zusammen mit der Klasse Werkstatt in ein eigenes Package stecken. Alle andere Klassen in andere Packages. protected = Sichtbar im selben Package.

edit: Huch das geht ja gar nicht direkt für ne Klasse. Aber du kannst den Konstruktor zumindest protected machen.

@profis: Wieso ist protected eig. nicht möglich für Klassen? Also wäre doch leichter wenn man will das ALLES protected ist in der Klasse. So muss man das überall dazu schreiben.

Auch wenn ich kein Profi bin 😉 : Es geht nicht, weil es gar keinen Sinn macht. Eine protected Klasse würde bedeuten, dass auf diese Klasse nur innerhalb des Packages zugegriffen werden kann, und dass Klassen darauf zugreifen können, die innerhalb des Packages liegen und von ihr erben ... ein wenig doppelgemoppelt und sinnlos 😉 . Und wenn du eine Klasse "protected" machen könntest, würde dass das obige Problem aber auch nicht lösen, da du zwar dann auch nur in diesem Package eine neue Instanz der Klasse erzeugen könntest, aber du auf dieses Objekt/diese Klasse auch nur in diesem Package zugreifen kannst.

Ein proteced oder package Konstruktor wäre hier für dein Problem eine Lösungsmöglichkeit.

Ich bin allerdings nicht so der Fan von Klassen, die zwangsläufig im selben Package liegen müssen, nur damit sie aufeinander zugreifen können und sonst von außen niemand. Je nach Anwendungsfall könnte es auch sinnvoll sein, den Techniker nicht als Klasse darzustellen, sondern als public Interface mit allen benötigten Schnittstellen. Die Klasse, die als einzigste einen "Techniker" erzeugen soll, besitzt eine private static class, die das Techniker-Interface implementiert und somit die Techniker-Klasse darstellt. Die Erzeugerklasse gibt dann bspw. beim Aufruf "Techniker createTechniker()" eine neue Instanz der nested class zurück.

Hätte halt den Nachteil, dass theoretisch noch andere Klassen das Techniker-Interface implementieren könnten. Dies könntest du bei einer finalen Klasse und einem package-sichtbaren Konstruktor umgehen.

Kommt halt immer ein bisschen darauf an, was damit am Ende dargestellt werden soll 😉 .
 
Zuletzt bearbeitet:
Die Klasse Techniker protected machen und zusammen mit der Klasse Werkstatt in ein eigenes Package stecken. Alle andere Klassen in andere Packages. protected = Sichtbar im selben Package.

edit: Huch das geht ja gar nicht direkt für ne Klasse. Aber du kannst den Konstruktor zumindest protected machen.

@profis: Wieso ist protected eig. nicht möglich für Klassen? Also wäre doch leichter wenn man will das ALLES protected ist in der Klasse. So muss man das überall dazu schreiben.
Man könnte auch einfach das public vor class weglassen, dann ist die Klasse auch nur sichtbar im package?
Ich glaube das meintest du ja auch so...
Also vergiss protected einfach.
 
Eine protected Klasse würde bedeuten, dass auf diese Klasse nur innerhalb des Packages zugegriffen werden kann
Oh, stimmt ja.
@TO: Also Klasse public machen, weil du ja damit in anderen packages arbeiten musst, aber Konstruktor protected machen, damit nur die Werkstatt eine Instanz erzeugen kann.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben