Generisch Programmieren

Klatz

Grünschnabel
hallo leute

Problemstellung:

Ich schrieb eine Methode, die auf ein Array von Objekten zugreift und ein neues Array von denselben Objekten zurückliefert (irrelevant). Die Objekte besitzen 2 Attribute und der Algorithmus benötigt einmal das eine Attribut und einmal das andere. Ich hab einfach copy paste gemacht und 2 mal beinahe fast die selbe Methode implementiert.

Code:
Objekte[] methode_1(Objekte[]) {

...

String Attribut1 = Objekte[0].attribut1;

....

}

Objekte[] methode_2(Objekte[]) {

...

String Attribut2 = Objekte[0].attribut2;

....

}

Beide Methoden sind wie gesagt beinahe identisch...nur an einer Stelle greife ich auf verschiedene Attribute des jeweiligen Objekts.


Kennt jemand von euch eine Möglichkeit, wie man das generisch machen kann, so dass nur eine Methode ausreicht?
 

zeja

Erfahrenes Mitglied
Wenn die Code-Teile wirklich gleich sind, dann diese Codeteile in eigene Methode auslagern:
Java:
Objekte[] methode_1(Objekte[] objs) {
   doSomethingBefore(objs);
  String attribut1 = objs[0].attribut1;
  doSomethingAfter(attribut1);
}

Objekte[] methode_2(Objekte[] objs) {
   doSomethingBefore(objs);
   String Attribut2 = objs[0].attribut2;
   doSomethingAfter(attribut2);
}
 

zeja

Erfahrenes Mitglied
Ich hab wirklich keine Ahnung was du in dem Fall mit generisch meinst?

Mit generischen Typen hat das was du vorhast ja wohl eher weniger zu tun, oder verstehe ich da irgendwas falsch?
 

Klatz

Grünschnabel
ich weiß nicht ob man das als generisch bezeichnet, aber man kann es mit dem Comparator lösen...fragt sich nur wie...
 

zerix

Hausmeister
Moderator
Hallo,

vielleicht zeigst du mal, was du genau in den Methoden machst. Es ist nämlich nicht immer möglich, das ganze so dynamisch zu machen.

MFG

Sascha
 

Klatz

Grünschnabel
leider darf ich den code nicht veröffentlichen, da wir noch abgeben abgeben müssen und der Code mit einem dubletten-checker später geprüft wird. der inhalt ist trotzdem irrelevant. man bekommt ein Array von Objekten die 2 Attribute haben und die methode returned eine hashtabelle. der hashcode sollte einmal das erste attribut hashen und dann das zweite, also muss ich innerhalb der methode auf das Attribut des Objektes, also mit der Punktnotation Objekt.attribut1 zugreifen. meine aufgabe ist es 2 hashtabellen zu bauen; einmal mit den gehashten 1. attributen und einmal nach den 2. attributen. doch das geht nur, wenn ich per copy-paste 2 Methoden habe...oder ich mach es generisch....aber wie? ich hab jetzt eine billig lösung implementiert, die der methode noch ein boolean übergibt und innerhalb der methode fallunterscheidungen gemacht werden....if (true) ....x = Objekt.attribut 1; else {....x = Objekt.attribut2} ....

das reduziert zwar den code um ungefähr die hälfte, aber das wahre ist es auch nicht.
 

zerix

Hausmeister
Moderator
Naja, ich hab nicht ganz verstanden, was du machen musst. ;-)

Aber warum übergibst du denn das ganze Array, wenn du immer nur den Inhalt brauchst. Übergib doch einfach nur den Inhalt, des jeweiligen Feldes.

MFG

Sascha
 

Tomek_FFM

Mitglied
Möglich wäre eine Lösung per Reflection...

Code:
import java.lang.reflect.Method;

public class Test {
	public static void main(String[] args) {
		new Test();
	}
	
	public Test() {
		Object[] objekte = new Object[1];
		objekte[0] = new DataObject();
		
		try {
			machWas(objekte, DataObject.class.getMethod("getAttribut1", new Class[] {}));
			machWas(objekte, DataObject.class.getMethod("getAttribut2", new Class[] {}));
		} catch (Exception e) {
			e.printStackTrace();
		}	
	}
	
	private void machWas(Object[] objekte, Method method) throws Exception  {
		// Mach was davor...
		
		// Aufruf der gewünschten Methode
		String attribut = (String)method.invoke(objekte[0], new Object[] {});
		System.out.println(attribut);
		
		// Mach was danach...
	}
	
	private class DataObject {
		public String getAttribut1() {
			return "Elefant";
		}
		
		public String getAttribut2() {
			return "Maus";
		}
	}
}

Ausgabe:
Code:
Elefant
Maus
 
Zuletzt bearbeitet: