Problem mit Variablenzugriff bei annonymous inner classes

Status
Nicht offen für weitere Antworten.

Moc

Neues Mitglied
Heyho,

meine Idee ist folgende:

Ich habe eine abtrakte Klasse 'Value' die representiert einen lesbaren Wert.

Zu dieser abstrakten Klasse gibt es nicht abstrakte Unterklassen, manche von denen Erlauben es, den Wert auch zu ändern. (Ja ich hab das hier etwas vereinfacht, bei meinem echten Projekt gibts noch mehr Details)

Ich möchte jetzt, dass jedes Objekt jeder dieser Klassen ein Wrapper-Objekt zurückgeben kann, das nur lesenden Zugriff gewährt (und auch sonnstige Funktionen versteckt).

Um das zu erreichen setze ich wie unten gezeigt annonymous inner classes ein. Aber das tut ganz und gar nicht so wie ich will:


Code:
/**
 * A class to test an inner class problem.
 */

public class ICTest {
	private static abstract class Value {
		public abstract double getValue();
		
		// private field, subclasses cannot see it.
		private final Value th = this;
		
		public final Value readOnly = new Value() {
			@Override public double getValue() { return th.getValue(); } };
	}
	
	private static class WritableValue extends Value {
		private double v = 0.0;
		
		@Override
		public double getValue() {
			return v;
		}
		
		public void setValue(double value) {
			v = value;
		}
	}

	public static void main(String[] args) {
		System.out.println("Creating new Writable Value");
		
		WritableValue test = new WritableValue();  // ###### Hangs
		
		
		System.out.println("Setting it");		
		test.setValue(2.0);
		
		
		System.out.println(test.getValue());
	}
}


th ist private, wird also nicht vererbt. Die Methode sollte also, dass th des erzeugenden Objectes sehen. Also th != this. Trotzdem gibt's ne Endlosschleife.

Kann mir jemand erklären warum?

Moc
 
wenn du ein bisschen auf die Fehlermeldung achten würdest, hättest du sehen können,
dass der Fehler schon im Konstruktor auftritt, getValue und setValue haben damit nix zu tun,

für ein Objekt vom Typ Value legst du einen Value
Value readOnly = new Value();
an

bein Anlegen von readOnly wird auch wieder ein readOnly erzeugt
bein Anlegen von readOnly2 wird auch wieder ein readOnly erzeugt
bein Anlegen von readOnly3 wird auch wieder ein readOnly erzeugt
..............
 
Vielen dank! Natürlich, ist ja auch genau das was passieren muss. Java ist halt nicht lazy genug um es so schreiben zu können.

Bin bei all dem inner-class-Quatsch natürlich davon ausgegangen, dass es damit zusammenhängt.

Moc
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben