Durch alle Attribute eines Objektes iterieren

krx

Mitglied
Hallo,

ich habe Methoden, die für alle Attribute eines Objektes angewendet werden sollen - z.B. (!) die Prüfung, ob irgendein Attribut null ist. Ich will nun aber nicht 10x schreiben müssen
Java:
obj.isNull(attribut);
Ich dachte, ich mache mir ein mal eine Hashtable mit allen Attributen des Objektes:
Java:
Hashtable hashtable = new Hashtable();
hashtable.put("name attribut 1", this.attribut1);
...
hashtable.put("name attribut 10", this.attribut10);
Und dann kann ich durch diese Hashtable iterieren und meine Methoden ausführen, die alle Attribute betreffen.
Das Problem ist, wie ich gemerkt habe, dass die Attribute in der Hashtable keine Referenz zu den Attributen des eigentlichen Objektes haben. Das heißt, wenn ich in der Hashtable eine Value ändere, ändert sich nicht das Attribut des Objektes.

Hat jemand eine Lösung oder einen ganz anderen Ansatz?
 
T

tröööt

Gast
ja ... sowas geht mit reflections ... du holst dir ein objekt .. davon die klasse ... darüber die variablen und prüfst im objekt-kontext auf inhalt ...

ist aber schlechtes design ...

mir würde zwar jetzt weniger ein grund einfallen warum man auf NULL prüfen sollte ... aber wenn man datenkapselung richtig anwendet muss man halt für jede variable getter und setter schreiben ... und wenn die klasse ein paar viele variablen hat muss man auch ein paar mehr methoden schreiben ...
 

ARadauer

Top Contributor
Das Stichwort heißt Reflection... alternativ kannst du auch org.apache.commons.beanutils.BeanUtilsBean von apache commons benutzen...
 
N

nillehammer

Gast
Das mit dem Speichern der Attribute in einem HashTable klappt nicht, weil Du eine Referenz auf das Attribut speicherst, wenn nicht-primitiv ist, bzw. den Wert, wenn es primitiv ist (int, char etc.). Wenn danach jemand den wirklichen Attributwert mit einer neuen Referenz belegt bzw dessen Wert ändert, steht in der Map ein veralteter Wert. Die sauberste Lösung wäre eine Methode mit Namen z.B. "validateState():
Java:
// Methode in der Klasse, deren Attribute validiert werden sollen.
public void validateState() {
  if(obj1 == null) {
    throw new NullpointerException("Attribut 'obj1' darf nicht null sein.");
  }
  if(obj2 < 0) {
    throw new IllegalArgumentException("Attribut 'obj2' mus >= 0 sein.");
  }
  ...
}
Da schreibst Du zwar die Prüfungen erstmal hin. Aber nur einmal und die Methode kannst Du dann von überall aufrufen. Ein etwas allgemeinerer Ansatz wäre Reflection/Introspection. Aber davon rate ich hier ab.
 
Zuletzt bearbeitet von einem Moderator:

anti-held

Bekanntes Mitglied
Über reflect funktioniert das super:

Java:
		try {
			Haus haus = new Haus("bla","bla");

			for (Field field : Haus.class.getDeclaredFields()) {
				field.setAccessible(true);
				System.out.println(field.getName() + ": " + (f.get(haus) == null)); // haus ist hier dann dein Object (bei dir dann this)
			}
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}

sollte alle Variablen von Haus auf null überprüfen und ausgeben
 
N

nillehammer

Gast
Den Code von anti-held in die von mir vorgeschlagene validateState()-Methode der zu validierenden Klasse und es müsste direkt funktionieren, auch ohne, dass man eigentlich private Felder mit:
Java:
field.setAccessible(true);
zugreifbar machen muss. Habe es nicht ausprobiert, aber es wäre einen Versuch wert.
 

JavaInBrain

Mitglied
Hallo krx,

ich bin zwar auch noch ein Newbie in JAVA, aber ein Merksatz hat sich mir schon eingeprägt:

Wenn du an einer bestehenden Klasse (--> Objekt) etwas ändern willst, dann überschreibe sie einfach ;)

Was das heißt, demonstriere ich an einem Beispiel, das ich vor kurzem erstellt habe. Ich musste 49 Buttons in einen Frame bzw. seinen contentpane einbetten, für die ich einige Attribute ändern wollte. Also habe ich eine eigene Klasse erstellt, die ich von JButton erben ließ.

Java:
package pFormDotComsVersenken;

import java.awt.Font;
import javax.swing.JButton;

/**
 * Die Klasse ändert Attribute für JButtons und gibt 
 * das geänderte Objekt zurück
 */
 public class DCVButton extends JButton {
//	Enumeration, um aus Buchstaben die x-Position abzuleiten
	public enum LetterNumbers {
		A (10),
		B (58),
		C (106),
		D (154),
		E (202),
		F (250),
		G (298);
		
		private int xPos;
		
		private LetterNumbers(int pos){
			xPos = pos;
		}
		public int getXPos(){
			return xPos;
		}
	}
	
	private int myY=0;	// Für die y-Position jeden Buttons
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -1139222144343874492L;

//	Konstruktor. Hier lege ich die Attribute fest (Font, Bounds(x,y,width,height)
//	Den x-Wert hole ich aus der enum (z. B. A = 10, B = 58 usw.)
//	Der Text, der übergeben wird, sieht z. B. so aus: "A1" oder "G4"
	public DCVButton(String Text) {
		Font f1 = new Font("Arial", Font.BOLD, 10);
		this.setFont(f1);
		this.setText(Text);
		this.setBounds(LetterNumbers.valueOf(Text.substring(0,1)).getXPos(), 
				getMyY(Integer.parseInt(Text.substring(1))),48,25);
	}
	
//	Hieraus kommt der y-Wert
	public int getMyY(int zeile) {
		switch(zeile){
		case 1:
			myY=25;break;
		case 2:
			myY=50;break;
		case 3:
			myY=75;break;
		case 4:
			myY=100;break;
		case 5:
			myY=125;break;
		case 6:
			myY=150;break;
		case 7:
			myY=175;break;
		default:
			myY=25;
		}
		return myY;
	}
	
}

In der aufrufenden Klasse sieht das so aus:

Java:
...
		String[] buc = {"A","B","C","D","E","F","G"}; //Buchstaben für Benennung der Buttons
		myButtons = new DCVButton[49];
		MyMouseListener mml = new MyMouseListener(this);

		for(String b:buc){
			for(int i = 1;i<8;i++){
				myButtons[i] = new DCVButton(b+String.valueOf(i));
				myButtons[i].setName("btn"+b+String.valueOf(i));
				myButtons[i].addMouseListener(mml);

				contentPane.add(myButtons[i]);
			}
		}
...

Noch Fragen?

Viele Grüße
JavaInBrain
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
Bademeister007 Operatoren Alle Zahlen einer ArrayList die durch 5 teilbar ist Java Basics - Anfänger-Themen 2
J Alle Vorkommen eines chars in einem Array durch einen anderen char ersetzen Java Basics - Anfänger-Themen 10
M alle Zahlen unter 50, die wo gteilt durch 2 Java Basics - Anfänger-Themen 12
C Dynamisch durch alle Objektvariablen eines Objektes iteriere Java Basics - Anfänger-Themen 15
G in String alle Kommas durch . ersetzten funzt nicht Java Basics - Anfänger-Themen 4
G alle Zahlen die durch 3 teilbar sind Java Basics - Anfänger-Themen 4
T Ich brauche eine Schleife die eine beliebige Zahl so lange durch 10 teilt bis zur Null Java Basics - Anfänger-Themen 5
X wie bekomme ich durch Eingabeaufforderung definierte double in einen Befehl, welcher 3 erwartete double braucht? Java Basics - Anfänger-Themen 3
T float soll durch schleife die größte mögliche Zahl herausfinden, Ausgabe ist aber "Infinity" Java Basics - Anfänger-Themen 1
H Counter durch gepresste Taste nur auf 1 erhöhen und nicht durchzählen lassen Java Basics - Anfänger-Themen 7
T Eingabe durch eine Zahl dividieren nachgucken? Java Basics - Anfänger-Themen 4
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
A 1 Leerzeichen durch zwei Leerzeichen ersetzen Java Basics - Anfänger-Themen 4
E Durch Muster in Array iterieren Java Basics - Anfänger-Themen 3
Thomas06 Wie kann man mithilfe von boolean herausfinden ob eine zahl durch 5 und 7 teilbart ist ? Java Basics - Anfänger-Themen 7
A JTextArea entfernen und durch neuen Text ersetzen Java Basics - Anfänger-Themen 8
B Den Dateipfad einer Java Datei durch Code in Selbiger finden? Java Basics - Anfänger-Themen 10
T Variable durch Action Listener ändern Java Basics - Anfänger-Themen 2
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
Agent4nobody Programmstart durch aufruf des interpreters funktioniert nicht Java Basics - Anfänger-Themen 14
obiwanke Ziffern durch ASCII Character ersetzen Java Basics - Anfänger-Themen 8
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
sserio Java Fx, wie erstellt man einen EventHandler, der durch das Drücken eines Button Texte in eine Table view einfügt Java Basics - Anfänger-Themen 17
S Durch HashMap iterieren Java Basics - Anfänger-Themen 8
A Wenn eine Zahl durch 7 teilbar ist, soll statt der Zahl ein ‘*‘ angezeigt werden. java? Java Basics - Anfänger-Themen 47
K mit <<1 kann man mal 2 machen, mit >>2 geteilt durch zwei und was bewirkt <<<1 und >>>1? Java Basics - Anfänger-Themen 5
A Verarbeiten einer Excel Datei durch das java-Programm Java Basics - Anfänger-Themen 3
C In String, Buchstaben ersetzen durch andere Buchstaben Java Basics - Anfänger-Themen 26
F Initialisieren eines Web-Mp3 Players in Tabs durch "booleans" erst wenn Tab geöffnet wird ...? Java Basics - Anfänger-Themen 1
W Werte durch Konsole einlesen Java Basics - Anfänger-Themen 10
C if-Konstrukt durch switch-Konstrukt ersetzen Java Basics - Anfänger-Themen 14
OZAN86 For Schleife von 1-50 die Zahlen werden durch ein Komma getrennt Java Basics - Anfänger-Themen 10
Y Wie kann ich Konsoleneingaben durch den Scanner mit JUnit 4 testen? Java Basics - Anfänger-Themen 1
yoskaem Text Color durch Klicken eines Buttons in anderer Activity ändern Java Basics - Anfänger-Themen 2
N for Schleife durch Rekursion ersetzen Java Basics - Anfänger-Themen 6
N Probleme beim printen von Arrays durch for Schleife Java Basics - Anfänger-Themen 3
L Iterieren durch eine ArrayList. Integer Array wird übergeben Java Basics - Anfänger-Themen 17
J Eine Position im String durch einen Integer - Wert teilen Java Basics - Anfänger-Themen 5
F Methoden Bitte Helft mir meinen Fehler zu finden. Möchte in diesem Bankenprogramm durch die Konsoleneingabe auswählen welches Konto reduziert und welches erhö Java Basics - Anfänger-Themen 17
E 2D Array - char durch die Matrix "wandern" lassen Java Basics - Anfänger-Themen 7
E Objekt durch Benutzer über Konsole erzeugen - Java Java Basics - Anfänger-Themen 3
F Methode für Teilbarkeit durch 5 tut was anderes.... Java Basics - Anfänger-Themen 3
H Aufruf von Methoden durch Methoden Java Basics - Anfänger-Themen 3
H Wie kann ich durch Methoden definiren? Java Basics - Anfänger-Themen 8
O Mehrfache Scanner-Eingabe durch Komma getrennt Java Basics - Anfänger-Themen 6
M String array durch Eingabe begrenzen Java Basics - Anfänger-Themen 7
J Dynamisches Array durch split()-Funktion? Java Basics - Anfänger-Themen 3
O Typparameter durch Wildcards verallgemeinern Java Basics - Anfänger-Themen 3
G Benutzereingaben durch Zeilenumbruch trennen und in Array individueller Größe speichern Java Basics - Anfänger-Themen 20
B Import Tabelle - Struktur durch User einstellbar Java Basics - Anfänger-Themen 4
K Durch eine Text eingabe etwas Ausführen Java Basics - Anfänger-Themen 5
T Konsolenscanner startet nicht durch Aufruf von Actionlistener Java Basics - Anfänger-Themen 4
A OOP Variable in anderer Klasse durch Methode aufrufen und einer anderen Variable gleichsetzen Java Basics - Anfänger-Themen 2
F Ein Datum (int) durch Methode als String formatieren Java Basics - Anfänger-Themen 2
B OOP While Schleife läuft Endlos durch externen aufruf Java Basics - Anfänger-Themen 2
D While Schleife bei Bedarf durch Eingabe stoppen Java Basics - Anfänger-Themen 15
CptK Interface Curser durch Bild ersetzen & MouseListner Java Basics - Anfänger-Themen 2
H OOP eine Zahl immer weiter durch 2 teilen Java Basics - Anfänger-Themen 15
I Null-Überprüfung durch Lambda-Expressions abkürzen Java Basics - Anfänger-Themen 8
W Teilstring durch Teilstring mittels StringBuilder ersetzen Java Basics - Anfänger-Themen 7
N Denksportaufgabe durch Algorithmus lösen Java Basics - Anfänger-Themen 2
H Array mit Zahlen die durch 3 und 5 teilbar sind erstellen Java Basics - Anfänger-Themen 13
D Interface Frame doppelt durch Aufruf der GUI Klasse Java Basics - Anfänger-Themen 1
J Die Zahl herausfinden die durch 2 - 30 Teilbar ist... Java Basics - Anfänger-Themen 17
M For-Schleife durch zwei versch. Variablen begrenzen Java Basics - Anfänger-Themen 27
W JLabel, Farbe durch Listener ändern Java Basics - Anfänger-Themen 6
T Extrahiertes Objekt durch Getter bekommen Java Basics - Anfänger-Themen 2
R Eine Schleife durch eine Methode schließen? Java Basics - Anfänger-Themen 4
N Operatoren Suchen nach einer bestimmten Eingabe (durch Scanner) Java Basics - Anfänger-Themen 7
S For-Schleife durch "ESC" verlassen? Java Basics - Anfänger-Themen 2
C char in String suchen und durch anderen String ersetzen Java Basics - Anfänger-Themen 2
T static String Variable wird nur beim ersten aufruf durch eine Funktion geändert. Java Basics - Anfänger-Themen 16
V Durch 0 teilen Java Basics - Anfänger-Themen 2
V Durch Methode Objekt löschen Java Basics - Anfänger-Themen 2
D Klasse durch eine Schleife wiederholen Java Basics - Anfänger-Themen 1
J Wie lege ich eine durch Random ausgesuchte Zahl in ein Array? Java Basics - Anfänger-Themen 3
S button kommt durch bild Java Basics - Anfänger-Themen 13
M Ein Bild durch Objekterzeugung zeichnen Java Basics - Anfänger-Themen 5
W Objektname durch Tastaturbefehl eingeben Java Basics - Anfänger-Themen 7
K ArrayList durch ArrayList ersetzen Java Basics - Anfänger-Themen 5
G Objektübergabe durch Parameter Java Basics - Anfänger-Themen 3
P Erste Schritte durch MenuBar verschiedene Fenster öffnen Java Basics - Anfänger-Themen 2
T Jlabel durch Text in 2 anderen Jlabels sichtbar machen Java Basics - Anfänger-Themen 4
T Threads Durch threads gestartete Prozesse killen Java Basics - Anfänger-Themen 2
M ArrayList durch OutputStream in Datei Java Basics - Anfänger-Themen 9
K arraygröße durch variablen Konstruktor? Java Basics - Anfänger-Themen 7
F Erste Schritte Hausaufgaben-Prob. - Iterative Prog. Zahlen aufsummieren, wenn durch k>0 teilbar. Java Basics - Anfänger-Themen 5
T Input/Output Programm beenden durch Eingabe Java Basics - Anfänger-Themen 1
K Tiefen- und Breitensuche beim Baum durch Stack und Warteschlange Java Basics - Anfänger-Themen 1
Ponychan95 Erste Schritte Switch fällt immer bis zum default durch Java Basics - Anfänger-Themen 4
J Warum wird Array durch Methode ohne Rückgabewert verändert? Java Basics - Anfänger-Themen 5
N Durch Objekte iterieren? Java Basics - Anfänger-Themen 3
J Durch 2-Dimensionales Array "bewegen" will nicht so recht hinhauen Java Basics - Anfänger-Themen 2
B Durch eine Liste von Strings laufen Java Basics - Anfänger-Themen 6
D javacode durch Html ausfuehren Java Basics - Anfänger-Themen 13
K Durch ArrayList laufen Java Basics - Anfänger-Themen 8
X Erste Schritte Lernen durch Videoreihe Java Basics - Anfänger-Themen 35
M Möglich? Methode aufrufen deren Bezeichner zur Laufzeit durch einen überg. String festgelegt wird Java Basics - Anfänger-Themen 3
T Best Practice JUnit: Wie Klassen durch Stubs/Mockups ersetzen Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben