PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Friend-Klassen in Java?


Nasenbaer
2008-07-01, 20:29:34
Ich hab folgendes Problem:
Ich habe eine Klasse A die eine Methode blub() besitzt. Dann habe ich noch eine andere Klasse B, die die Methode blub() aufrufen können soll. Aber aus keiner anderen Klasse heraus wäre es sinnvoll blub() zu rufen und deswegen würde ich sie gern private machen aber das geht ja nich, weil ich sie in B brauche.
Mit Friend-Klassen könnte ich das lösen aber sowas hab ich für Java nicht gefunden - irgendwelche Vorschläge? :smile:

Bietchiebatchie
2008-07-01, 20:51:45
Ich bin mir nicht wirklich sicher, ob das auch unter Java geht, aber prinzipiell kann man dein Problem (ohne friend) nur lösen, indem man B innerhalb von A deklariert:

public class A
{
public class B
{
public void Bar()
{
A a = new A();
a.blub();
}
}

private void blub()
{

}
}

Ist das ne Option?

Xmas
2008-07-01, 20:54:05
Du könntest die Methode package-private machen (ganz ohne Access-Modifier), dann kannst du darauf nur innerhalb desselben Package zugreifen.

Nasenbaer
2008-07-01, 20:59:04
Nested Klassen und selbes Package sind wohl leider keine Option da es sich bei beiden um ganze Klassenhierachien handelt.

Bietchiebatchie
2008-07-01, 21:01:07
Dann bleibt wohl nur noch private reflection ;)

Nasenbaer
2008-07-01, 21:25:16
Dann bleibt wohl nur noch private reflection ;)
Ok werd danach mal googeln. Thx :)

Bietchiebatchie
2008-07-01, 21:31:17
Sorry, das war nicht wirklich ernst gemeint.
Dokumentier die Methode ausführlich und mach sie public - wird schon passen.

Monger
2008-07-01, 22:09:24
Java kennt vier Sichtbarkeitsoperatoren:

public, private, protected und package-public

Wenn man gar nichts hinschreibt, ist es nur innerhalb des selben Packages zugänglich - das dürfte wohl in etwa sein was du suchst.

ethrandil
2008-07-02, 11:35:41
Du könntest , wenn es wirklich modellierungskritisch ist, einen 'access-parameter' einbauen:


class A{
public void geheim(B accessor){
if(accessor == null)
throw new IllegalAccessError(...);
}
}


Dann kann jedes Objekt, dass ein B-Objekt zur Verfügung hat, die Methode aufrufen. Das sind schonmal weniger als alle. Wenn du sicher sein willst, dass auch Objekte die ein B kennen aber nicht vom Typ B sind die Methode nicht aufrufen können:


public class Secretkeeper {
public void secretMethod(SecretAccessor sa)
{
sa.enterSecretMethod(new Secret(this));
}

private void realSecretMethod()
{
// Your code here
}

final class Secret {
private Secretkeeper _sk;
private Secret(Secretkeeper sk){
_sk = sk;
}
public void executeSecretMethod(){
_sk.realSecretMethod();
}
}
}
public class SecretAccessor {
public void enterSecretMethod(Secret secret)
{
secret.executeSecretMethod();
}

public void main()
{
new Secretkeeper().secretMethod(this);
}
}


Ich weiß aber nicht, ob du sowas wirklich einsetzen willst. Ich kann mir kaum einen Entwurf vorstellen, wo sich der Aufwand lohnt. Wenn du SecretAccessor als Interface ausführst, kannst du damit auch komplexere Szenarien modellieren und die Kopplung ein bisschen reduzieren.

- eth

Nasenbaer
2008-07-03, 19:02:06
@Monger

Package-public geht nicht, weil sie wirklich in unterschiedlichen Packages liegen und das aus semantischer Sicht einfach sinnvoll ist.

Ich weiß aber nicht, ob du sowas wirklich einsetzen willst. Ich kann mir kaum einen Entwurf vorstellen, wo sich der Aufwand lohnt. Wenn du SecretAccessor als Interface ausführst, kannst du damit auch komplexere Szenarien modellieren und die Kopplung ein bisschen reduzieren.

- eth
Jo das wäre zwar eine gute Lösung des Problem aber völlig überdimensioniert. Ich glaube ich werde auf den Verstand der Nutzer vertrauen und durch eine ordentlich Doku das Problem klar machen, d.h. wenn ich nicht sowieso demnächst wieder einiges umstrukturiere und das dadurch hinfällig wird. ^^