Alternative Darstellung eines Codesnippets

Diskutiere Alternative Darstellung eines Codesnippets im Allgemeine Java-Themen Bereich.
mrBrown

mrBrown

Das Class.forName ist dort überflüssig, du kannst einfach direkt die die Klasse nutzen: Class<Greeting> clazz = Greeting.class.

Nach meinem Verständnis soll args ein Array der konkreten Argumente sein, aktuell übergibst du eine Array der generischen Parameter der Methode (was doppelt falsch sein dürfte).
Wenn ich das nicht falsch verstehe reicht dort zB ein einfaches [/icode]new Object[]{"Hallo Welt}[/icode] - sayGreeting erwartet als ersten Parameter einen String, also muss im Array an erste Stelle ein String stehen.
 
Zrebna

Zrebna

Das Class.forName ist dort überflüssig, du kannst einfach direkt die die Klasse nutzen: Class<Greeting> clazz = Greeting.class.

Ah ja, stimmt - danke!


Nach meinem Verständnis soll args ein Array der konkreten Argumente sein, aktuell übergibst du eine Array der generischen Parameter der Methode (was doppelt falsch sein dürfte).
Array der konkreten Argumente der Methode sayGreeting() in der Klasse "'Greeting'?
Aktuell übergebe ich ja in dieser Klasse als Parameter für die Methode einen String.
Muss ich quasi dieser Methode zwei Parameter übergeben - einmal den String und einmal das Object[] ?



Wenn ich das nicht falsch verstehe reicht dort zB ein einfaches [/icode]new Object[]{"Hallo Welt}[/icode] - sayGreeting erwartet als ersten Parameter einen String, also muss im Array an erste Stelle ein String stehen.

Wo genau sollte das stehen?
 
mrBrown

mrBrown

Sorry, deine Antwort ist wohl untergegangen, weil sie im Zitat steht :)

Invocation ist eine von dir geschriebene Klasse?
 
Zrebna

Zrebna

Kein Ding und ja, 'Invocation' ist eine Klasse, die ich geschrieben habe.

Ich poste mal den Code zu dieser Klasse:

Java:
public class Invocation {
    private final String self;
    private final Method method;
    private final Object[] args;

    // constructor
    public Invocation(String self, Method method, Object[] args) {
        this.self = self;
        this.method = method;
        this.args = args;
    }

    // getters
    public String getSelf() {
        return self;
    }

    public Method getMethod() {
        return method;
    }

    public Object[] getArgs() {
        return args;
    }


    @Override
    public boolean equals(Object o) {
       if(o == null)
           return false;

       if(!(o instanceof Invocation))
           return false;

       Invocation other = (Invocation) o;

        if(this.getSelf() != null) {
            if(!this.getSelf().equals(other.getSelf()))
                return false;
        } else {
            if(other.getSelf() != null) {
                return false;
            }
        }

        if(this.getMethod() != null) {
            if(!this.getMethod().equals(other.getMethod()))
                return false;
        } else {
            if(other.getMethod() != null)
                return false;
        }
        // use Arrays.deepEquals to compare Object[]
       return Arrays.deepEquals(getArgs(), other.getArgs());
    }

    @Override
    public int hashCode() {
        int result;
        if(getSelf() != null) {
           result = getSelf().hashCode();
        } else {
            result = 0;
        }

        if(getMethod() != null) {
            result = 31 * result + getMethod().hashCode();
        } else  {
            result = 31 * result;
        }
        result = 31 * result + Arrays.hashCode(args);

        return result;
    }
}
 
mrBrown

mrBrown

Dann weißt du doch, was die drei Felder sein sollen, und wie man die Klasse benutzt? :)
 
Zrebna

Zrebna

Ich weiß nicht, wie ich auf das letzte Attribut (Object[] args) prüfe/teste.

So ja eben nicht:

Java:
    @Test
    public void testEquals_BeideNonNull() throws ClassNotFoundException, NoSuchMethodException {
        Class<Greeting> clazz = Greeting.class;

     //   Invocation object1 = new Invocation("Hello", null, null);
      //  Invocation object2 = new Invocation("Hello", null, null);
       // Invocation object3 = null;
        Invocation object1 = new Invocation("Hello", clazz.getDeclaredMethod("sayGreeting", String.class), clazz.getDeclaredMethod("sayGreeting", String.class).getTypeParameters());
        Invocation object2 = new Invocation("Hello", clazz.getDeclaredMethod("sayGreeting", String.class), clazz.getDeclaredMethod("sayGreeting", String.class).getTypeParameters());

        boolean result = object1.equals(object2);
        Assert.assertEquals("Objects are not equal", true, result);
      // Assert.assertEquals(object1, object2);

    }
Wie würdest du es machen?
Kannst du evtl. meinen Codesnippet so adjusten, dass der Test funktionsfähig bzw. richtig wäre, damit ich mal sehen kann wie es korrekt aussieht und dann darüber nachdenken kann?
 
Zrebna

Zrebna

Das ist schon mal der Punkt - keine Ahnung ehrlich gesagt - ursprüngliche Codevorlage nicht von mir...
 
mrBrown

mrBrown

Du hast da also jetzt Code, der nicht von dir ist und von dem du nicht weißt, was er überhaupt darstellen soll, und sollst dafür Tests schreiben? o_O


Ich Versuchs mal zu erklären: Invocation soll einen Methoden-Aufruf modellieren. Eine Methoden-Aufruf braucht zwei Dinge: eine Methode und Argumente für diese Methode. Als Beispiel einfach mal Object#equals: equals bekommt einen Parameter vom Typ Object, also einfach irgendein Object.
Für den konkreten Aufruf (über reflection) muss man natürlich alle Argumente der Methode "auf einmal" übergeben, da man nicht weiß wie viele das sind, kapselt man die in einem Array. equals bekommt einen Parameter, also ein Array der Länge 1.


Für deinen Test musst du so einen "Methodenaufruf" zusammenbauen - du brauchst also eine Methode und Beispiel-Argumente für diese Methode. Denk dir dafür einfach, wie du den Methodenaufruf "ganz normal" aufschreiben würdest (""abc".equals("abc")"), das musst du dann nur noch in der andere Form überführen.
 
Zrebna

Zrebna

Hi!

Also konzeptuell weiß ich schon, dass diese 3 Attribute in der Klasse Invocation den Funktionskopf darstellen sollen oder Teile davon:

Java:
   private final String self;
    private final Method method;
    private final Object[] args;
Object[] args sind die übergebenen Parameter.
Method method ist die Methode selber (zb.: equals() ).
self ist dann das aufrufende Objekt?
-> (""abc".equals("abc")")
Also hier wäre dann 'self' das erste 'abc' ?

Nun habe ich eine neue Klasse incl. folgender Methode erstellt:
Java:
public class Greeting {

    private final String str;

    public Greeting(String str) {
        this.str = str;
    }

    // method
    public String sayGreeting(String str) {
        return str;
    }
}
Bevor ich es erneut versuche, will ich zu Erst wissen, ob ich es richtig verstehe:
1.) Nun deklariere und initialisiere ich wohl eine Methode in meiner Testklasse und kann dann per equals() abprüfen, ob es sich hierbei
um die selbe Methode, wie in der Klasse "Greeting" handelt?
2.) Mir dämmert gerade: Eigentlich hätte ich die Methode gegen die ich vergleichen will auch gleich in der Invocation-Klasse erstellen können,
statt extra eine neue Klasse ('Greeting') hierfür zu erzeugen?
 
mrBrown

mrBrown

self ist dann das aufrufende Objekt?
-> (""abc".equals("abc")")
Also hier wäre dann 'self' das erste 'abc' ?
Keine Ahnung was self sein soll. Das es das "Ziel-Objekt" ist, ist möglich, aber unsinnig, weil man dann nur auf String beschränkt ist. Das wäre eine gute Frage an den, der den Code geschrieben hat...

1.) Nun deklariere und initialisiere ich wohl eine Methode in meiner Testklasse und kann dann per equals() abprüfen, ob es sich hierbei
um die selbe Methode, wie in der Klasse "Greeting" handelt?
Nein. Du willst doch die Invocation-Klasse testen? Dafür musst du Objekte der Invocation-Klasse erzeugen (das braucht dann natürlich ein Method-Objekt, aber mit dem arbeitest du dann direkt im Test nicht).

2.) Mir dämmert gerade: Eigentlich hätte ich die Methode gegen die ich vergleichen will auch gleich in der Invocation-Klasse erstellen können,
statt extra eine neue Klasse ('Greeting') hierfür zu erzeugen?
Ne, das wäre Unsinn. Der Invocation-Klasse solltest du nicht einfach irgnendwelche zufälligen Methode hinzufügen, nur weil das halt grad möglich wäre.
 
mrBrown

mrBrown

Lieg ich richtig mit der Annahme, dass das irgendeine Schul-/Studiums-/Ausbildungsaufgabe ist, die Du lösen sollst? (Falls nicht; warum hast du Code geschrieben, von dem du keine Ahnung hast wofür er da ist?)

Ich würde dir in jedem Fall empfehlen, noch mal 2, 3 Schritte zurückzugehen. Wenn du daran scheiterst, ist das immer ein Hinweis auf zu wenig Grundlagenwissen - und das muss man sich einfach aneignen, alles vorgesagt bekommen hilft dabei nicht.
 
Zrebna

Zrebna

Ja, Annahme richtig.

Agree to disagree mit letzem Statement, zumindest partiell.
Aus Erfahrung hilft es schon oft notfalls einen Lösungsvorschlag zu ergatten (halt nur im Notfall - besser als Nichts) und dann Reverse Engineering betreiben.
Also versuchen Lösungscode (hier vermeintlichen Lösungscode, da von gitHub -> auch keine Möglichkeit nachzufragen, was wie und wo gemeint gewesen ist) Schritt für Schritt nachzuvollziehen und zu bearbeiten - öfter als nicht, hiilft das einem schon weiter die Sache hinterher auch selber zu meistern - aber halt nicht immer, und hier eben mal nicht - Problematisch ist auch, dass ggf. zu viele Unklarheiten bzgl. dem Lösungscode herrschen.

Dieser Quote von dir "alles vorgesagt bekommen hilft dabei nicht. "
ist hier meiner Meinung und Erfahrung nach eben nicht sehr zutreffend, da ja nicht einfach nur die Hand aufgehalten werden will, sondern man ja
ggf, und notfalls mittels Lösungsvorschlag versucht die Sache selber zu schnallen - sonst müsste man ja Seiten wie 'stack overflow' direkt abschaffen und ihnen ihre Daseinsberechtigung bzgl. Hilfeform absprechen.
Ich akzeptiere aber natürlich, dass du das ggf. anders siehst - daher eben mein vorheriges 'let's agree to disagree' xD

Ich cutte hier dann auch in dem Thread, weil wir wohl so nicht mehr weiterkommen... wie gesagt, das mag auch an dem unklarem Code liegen, so dass sogar ich nicht weiß, wie und wo, was genau gemeint ist und jedoch auch keine Möglichkeit habe nachzufragen (siehe oben).

Trotzdem Danke für die Mühen und ansonsten kann der Thread meinetwegen auch ab nun geschlossen werden, falls dass ggf. von Seiten der Mods gewünscht ist.


Gruß,
Zrebna
 
Thema: 

Alternative Darstellung eines Codesnippets

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben