Klassen Warning "synthetic access" bei innerer Klasse

cable545

Aktives Mitglied
hallo
ich habe in Eclipse eine Warning Meldung die ich nicht verstehe. Diese lautet:
"Read access to enclosing field ...... is emulated by a synthetic accessor method"
Diese tritt auf in einer inneren Klasse in welcher ich eine "private" Variable der äußeren Klasse nutze.
Wenn ich den Zugriff von "private" auf "public ändere verschwindet die Meldung in Eclipse.
Kann mir eventuell jemand helfen und erklären was es mit der Meldung auf sich hat?
 
Das heisst, dass die Inner Class wohl gar keinen Zugriff hätte. Aber der Compiler ermöglicht dir das über eine generierte Methode. Wieso verwendest du nicht [c]protected[/c]?
 
Und wie siehts aus, wenn du getter benutzt anstelle eines direkten Zugriffs?

Also
Java:
private int variable;

public void setVariable(int variable) {
     this.variable = variable;
}

public int getVariable() {
     return this.variable;
}
 
Die Instanzvariable welche ich in der inneren Klasse nutze ist ein Button aus der SWT Bibleothek. Ich nutze ihn in der äußeren als auch in der inneren Klasse. Aber ich wolllte nicht, dass man mit einer Instanz der äußeren Klasse auf das Button Objekt von außen zugreifen kann. Daher das "private".
 
"Die mit private deklarierten Methoden und Variablen sind nur innerhalb der eigenen Klasse sichtbar. Eine Ausnahme bilden innere Klassen, die auch auf private Eigenschaften der äußeren Klasse zugreifen können."

Keine Ahnung warum mir Eclipse diese Wahrnungen verpasst. Ich werd mal versuchen die Klasse mit dem javac zu compilieren. Mal sehen was der sagt.
 
eine Warnung ist nunmal eine Warnung, kein Fehler,
es kompiliert, es funktioniert,
nur unterschlägt der ""-Satz, dass da auf komplizierte Weise Zugriffsmethoden für das private Feld angelegt werden müssen,
die Warnung teilt dir das mit, du kannst sie ignorieren, gar ausschalten (generell oder einzeln per Annotation) oder den Modifier des Attributes ändern für besseren internen Zugriff
 
Wie gesagt, der Compiler muss irgendwas dazu basteln, weil er sonst nicht auf das Feld zugreifen kann. Es ist zwar erlaubt, aber er kann es nicht direkt machen. Wenn du dazu googelst, findest du überall die gleichen Antworten.
Um was geht es genau? Je nach Anwendungsfall kann man es anders kapseln oder protected Methoden anbieten, welche das gewünschte Ergebnis liefern. Wenn die Inner Class z.B. nur einen Reset für eine Variable vornehmen können muss, und die Variable [c]private Foo foo[/c] heisst, dann würde ich mir [c]protected void resetFoo()[/c] implementieren.
Es liegt bei dir, ob du die Warning bearbeiten willst, oder nicht.
 
Es liegt bei dir, ob du die Warning bearbeiten willst, oder nicht.

Wobei es manchmal ne ganz schöne Qual sein kann alle Warnings zu bearbeiten:
Java-Problems(89 items)

Vielleicht sollte ich Eclipse mal weniger emfpindlich einstellen xD

PS:
Generell sollte man sich jedoch um alle Warnings kümmern, die sind ja nicht umsonst da....
 
Java-Problems(89 items)

Qual? 89 Items? Ich hab schon Projekte mit >20k übernommen 😀 Aber alleine schon durch die Auto-Fixes konnte man das auf 1000 Items reduzieren.
In den Projekten hab ich fast nur noch die Meldungen, dass man Generics verwenden sollte. Ist aber leider nicht lösbar, da die Datenschnittstellen ohne Generics bekommen und diese %"*ç+*%ç im Moment überhaupt nicht daran denken, so was zu implementieren :autsch:
 
Qual? 89 Items? Ich hab schon Projekte mit >20k übernommen 😀 Aber alleine schon durch die Auto-Fixes konnte man das auf 1000 Items reduzieren.
In den Projekten hab ich fast nur noch die Meldungen, dass man Generics verwenden sollte. Ist aber leider nicht lösbar, da die Datenschnittstellen ohne Generics bekommen und diese %"*ç+*%ç im Moment überhaupt nicht daran denken, so was zu implementieren :autsch:

Die 89-Items sind ja nach 3 Wochen Projektüberholung, davor warens über 600....(Sind seit dem 200 Zeilen code dazu gekommen xD)
 
Also ich hab eine Gui Klasse in der ich ein paar Instanzvariablen, also "Buttons", hab. Die inneren Klassen sind die listener Klassen in meiner Gui Klasse. Diese implementieren jeweils ein listener Interface mit den dazugehörigen Methoden. Ich brauche die Buttons in diesen Methoden als auch in der äußeren Klasse.
 
Na dann verwend doch - wie nun schon zum x. Mal vorgeschlagen - [c]protected[/c]. Meist meint man nur, man benötigt [c]private[/c], aber eigentlich genügt [c]protected[/c]. Das einzige, was manchmal etwas stört, ist hier die Paketsichtbarkeit. Aber [c]private[/c] verwende ich meist nur, wenn eine abgeleitete Klasse dieses Feld nicht sehen sollte. Aber warum sollte nun z.B. eine Subklasse deines GUIs keinen Zugriff auf deine Buttons haben?
 

Zurück
Oben