tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
327
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Klatz Klatz ist offline Mitglied
    Registriert seit
    Dec 2007
    Beiträge
    12
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    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?
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Wenn die Code-Teile wirklich gleich sind, dann diese Codeteile in eigene Methode auslagern:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    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);
    }
     

  3. #3
    Klatz Klatz ist offline Mitglied
    Registriert seit
    Dec 2007
    Beiträge
    12
    ein gute Idee. So könnte man das Problem umgehen..aber ich muss es generisch hinkriegen.
     

  4. #4
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    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?
     

  5. #5
    Klatz Klatz ist offline Mitglied
    Registriert seit
    Dec 2007
    Beiträge
    12
    ich weiß nicht ob man das als generisch bezeichnet, aber man kann es mit dem Comparator lösen...fragt sich nur wie...
     

  6. #6
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  7. #7
    Klatz Klatz ist offline Mitglied
    Registriert seit
    Dec 2007
    Beiträge
    12
    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.
     

  8. #8
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  9. #9
    Tomek_FFM Tomek_FFM ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Ort
    Frankfurt am Main
    Beiträge
    67
    Möglich wäre eine Lösung per Reflection...

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    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 :
    1
    2
    
    Elefant
    Maus
    Geändert von Tomek_FFM (18.06.08 um 15:03 Uhr)
     

Ähnliche Themen

  1. Rich:tabPanel generisch füllen?
    Von RoCMe im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 2
    Letzter Beitrag: 02.03.10, 06:53
  2. Generisch mehrdimensionale Arrays erzeugen?
    Von dbzworld im Forum Java
    Antworten: 7
    Letzter Beitrag: 12.12.09, 18:06
  3. Antworten: 3
    Letzter Beitrag: 07.09.09, 18:36
  4. MySqlDataReader Resultat "generisch" speichern
    Von ChristianR1905 im Forum .NET Datenverwaltung
    Antworten: 3
    Letzter Beitrag: 07.08.08, 09:59
  5. Programmieren für c und c++
    Von blackbirdthefirst im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 28.12.05, 18:35