Alternative Darstellung eines Codesnippets

Zrebna

Bekanntes Mitglied
Hi!

Ich frage mich wie man dieses Code-snippet innerhalb einer überschriebenen
equals()-Methode auch mit einer if-Kaskade äquivalent darstellen kann?

Code mit verkürzter Syntax:

Java:
 @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Invocation)) return false;

        Invocation that = (Invocation) o;

        if (getSelf() != null ? !getSelf().equals(that.getSelf()) : that.getSelf() != null) return false;
        if (getMethod() != null ? !getMethod().equals(that.getMethod()) : that.getMethod() != null) return false;
        
        return Arrays.deepEquals(getArgs(), that.getArgs());
    }

Mein Vorschlag für eine if-Kaskaden-Schreibweise:
Java:
@Override
    public boolean equals(Object o) {
       if(this == o)
           return true;
       if(!(o instanceof Invocation))
           return false;

       Invocation other = (Invocation) o;

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

    }

Kommt das so hin bzw. mach der 2te Code genau das selbe, wie der erste Code?

Lg,
Zrebna
 
K

kneitzel

Gast
Also generell ist der übliche Weg, das einfach mit Unit Tests abzudecken. Dann kannst Du Code umschreiben und hast immer die Kontrolle, dass du es nicht kaputt gemacht hast.

Auf den ersten Blick sieht es erst einmal ok aus, aber beim drüber lesen übersieht man schnell mal etwas.

Und als Anregung: wenn Arrays.deepEquals benutzt werden darf, dann doch bestimmt auch Objects.equals:

Das erspart dann diese Vergleichsarie mit Null Prüfung..
 
K

kneitzel

Gast
Ach so: nein, der Code scheint falsch zu sein. Ein return true kannst du nicht bringen, ehe du alles getestet hast.

Das Pattern ist immer:
Wenn ein Element nicht gleich ist, dann return false.
Nur beim letzten Element kommt dann auch die Option, true zurück zu geben!

Somit gehst du bei dem Vergleich eines Elementes bei Gleichheit zum nächsten Element weiter.
 

Zrebna

Bekanntes Mitglied
Hi!

Also eher so?
Java:
@Override
    public boolean equals(Object o) {
       if(this == o)
           return true;
       if(o == null)
           return false;
       if(!(o instanceof Invocation))
           return false;

       Invocation other = (Invocation) o;

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

Wieso ist der Kollege (verkürzter Code im Eingsngspost) von dem Schema "zu Erst alles auf mögliche False und am Ende true returnen"
abgewichen?

offtopic:
Kennt Jemand gute Tutorials bgzl. Domain Specific Languages in Java? Schwierig da etwas hilfreiches zu finden...
 
K

kneitzel

Gast
Da fehlt jetzt der Null check.

Das pattern ist:
Ist das Element null?
Ja: ==> prüfe das Element in anderer Instanz auf Null. Gib falls zurück, falls es nicht null ist.
Nein: ==> prüfe ob Elemente ungleich sind und gib false zurück falls die Element nicht gleich sind.

Da du dies ja mehrfach brauchst, kannst du es in eine Methode auslagern. Dann hättest du eine Methode wie Objects.equals ... da kannst du dir ja auch einmal den Source Code von ansehen:

Dann siehst du die kompakte Version des oben beschriebenen. Um die zu bekommen kannst du überlegen, in welchen Fällen true zurück gegeben werden soll ...
 
K

kneitzel

Gast
Wenn wir bei alternativen Lösungen sind, dann werfe ich noch Lombok ins Rennen....

Warum Code schreiben, der einfach nur Tipparbeit ist? Zu einem Feld Getter/Setter schreiben, Konstruktoren, die einfach nur für Felder Werte entgegen nimmt und diese dann in die Felder einträgt... und natürlich equals und hashcode nicht zu vergessen.... Oder toString um was sinnvolles im log zu sehen ....

Daher mein Favorit: www.projectlombok.org
 

Zrebna

Bekanntes Mitglied
Danke!
Ich gucke mir den SourceCode an.

Bzgl. diesem Code hier - passt es nun? (Habe den Anfang geändert - zuerst Check auf Null, dann auf Gleichheit (falls beide nicht Null sind).

Java:
  @Override
    public boolean equals(Object o) {
       if(this == o)
           return true;
       if(this == null) {
           if(o != null)
               return false;
       }
       if(!(o instanceof Invocation))
           return false;

       Invocation other = (Invocation) o;

       if(!getSelf().equals(other.getSelf())) {
           return false;
       }
       if(!getMethod().equals(other.getMethod()))
           return false;

        // use Arrays.deepEquals to compare Object[]
       return Arrays.deepEquals(getArgs(), other.getArgs());
    }

Ansonsten verstehe ich bzgl. den letzten paar Posts eher nur Bahnhof - ich bin ein Java-Anfänger und habe die Sprache
erst im Rahmen meines Studiums kennen gelernt - daher sind Inhalte der letzten Postings für mich noch viel zu advanced und
wohl auch im Rahmen meines Studiums, da dies noch nicht relevant ist.

Ansonsten noch eine Frage bzgl., wie man meine equals-Methode im Rahmen von JUnit testen könnte:
Quasi unter 'test' eine Klasse erstellen und dort zwei Objekte der zu testenden Klasse initialisieren und dann eben testen?
Ich hab schon JUnit-testing mittels einfachen Beispielen kennnengelernt (ka, z.B. einfache Methode zur Summenberechnung), aber noch nicht
im Rahmen nicht primitiver Datentypen, wie hier.

So wäre mein Anfang:

Java:
import de.oth.mocker.Invocation;
import org.junit.jupiter.api.Test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class MockerTest {

    Class<?> clazz = Class.forName("de.oth.mocker.Invocation");
    Method methodStr = clazz.getDeclaredMethod("toString", String.class);
    Object[] object = (Object[]) clazz.getDeclaredConstructor(String.class, Method.class, Object[].class).newInstance("Hello", methodStr, "World");

    public MockerTest() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
    }

    Invocation invocationObject = new Invocation("Hello", methodStr, object);
    @Test
    public void equalsTest() {
     // need antoher object to test against
    }
}

Das fühlt sich bis dato richtungsweise nicht richtig an...


Offtopic:
Gibt es eigentlich hier im Forum auch irrgendwo Nachhilfe-Anzeigen/Gesuche?
Ist das ein Ding hier, oder wird mir am Ende nichts anderes übrig bleiben, als mal Fiverr anzusteuern? xD

Trotzdem danke für den Input, aber wie gesagt:
Die letzten paar Pots sind zu weit weg von meinem jetzigem Stand un dem meiner Kommilitonen...

Lg,
Zrebna
 
Zuletzt bearbeitet:

LimDul

Top Contributor
Bezüglch des Test-Codes - was zur Hölle machst du da? :)

Java:
@Test
public void testEquals_BeideNonNull() {
  MyClass object1 = new MyClass("Wert", 1);
 MyClass object2 = new MyClass("Wert", 1);

assertEquals(object1, object2);
}

Reflection brauchst du nicht, einfach plain Java Code schreiben.
 
K

kneitzel

Gast
Also ein paar Punkte, die mir auffallen:

a) Check auf null:
Code:
       if(this == null) {
           if(o != null)
               return false;
       }
Das ist so verdreht. Bei einem Aufruf someObject.equals(someOtherObject) kommt eine NPE, wenn someObject null ist. Eine Prüfung von this==null ist somit nicht notwendig. this kann nicht null sein!
Und du willst ja auch eher prüfen: Ist das andere Objekt null. Also wäre da lediglich der Code: if (o == null) return false; notwendig.

b) Du bekommst NPEs!
Code:
if(!getSelf().equals(other.getSelf())) {
           return false;
       }
Wenn getSelf() null zurück gibt, dann hast Du hier eine NPE. Die Prüfung ist also

Code:
if (getSelf != null) {
       // getSelf ist nicht null, daher Prüfung, ob es nicht gleich ist.
       if(!getSelf().equals(other.getSelf())) {
           return false;
       }
} else {
       // getSelf ist null, daher ist es nicht gleich, wenn other.getSelf nicht null ist.
       if (other.getSelf() != null) return false;
}

c) Zum Unit Test hat @LimDul schon einen wichtigen Punkt geschrieben. Was da noch wichtig ist, ist, dass Du Dir alle Kominationen aussuchst und testest. Also einfach den Code durchgehen und sicher stellen, dass Du in alle Elemente rein läufst.
- test mit sich selbst (if(this == o))
- test mit null (if (o == null))
- test mit etwas, das keine Instanz von Invocation ist
- test bei getSelf: in beidem null, dann jeweils in einem wird null zurück gegeben, dann beide nicht null aber einmal gleich und einmal nicht gleich ...
- test mit nächstem Element aus Invocation ...

So stellst Du sicher, dass alle Pfade durchlaufen werden ....
 

Zrebna

Bekanntes Mitglied
Bezüglch des Test-Codes - was zur Hölle machst du da? :)

Java:
@Test
public void testEquals_BeideNonNull() {
  MyClass object1 = new MyClass("Wert", 1);
MyClass object2 = new MyClass("Wert", 1);

assertEquals(object1, object2);
}

Reflection brauchst du nicht, einfach plain Java Code schreiben.


Ich weiß, wie bei "normalen" Klassen Tests funktionieren - also z.B. bei Klassenobjekten, wie in deinem Beispiel mit
gängigen Attributen, wie String und Integer, z.B.

In meinem Fall sind ja dies die folgenden 3 Attirbute:
private final String self;
private final Method method;
private final Object[] args;

Außer bei dei dem erstem Feld, weiß ich nicht, wie man das testen soll.

PS: Was ist das bei meinem Test-Code mache - diese Frage ist berechtig, denn das weiß ich selber nicht so recht D:
 

Zrebna

Bekanntes Mitglied
Also ein paar Punkte, die mir auffallen:

a) Check auf null:
Code:
       if(this == null) {
           if(o != null)
               return false;
       }
Das ist so verdreht. Bei einem Aufruf someObject.equals(someOtherObject) kommt eine NPE, wenn someObject null ist. Eine Prüfung von this==null ist somit nicht notwendig. this kann nicht null sein!
Und du willst ja auch eher prüfen: Ist das andere Objekt null. Also wäre da lediglich der Code: if (o == null) return false; notwendig.

b) Du bekommst NPEs!
Code:
if(!getSelf().equals(other.getSelf())) {
           return false;
       }
Wenn getSelf() null zurück gibt, dann hast Du hier eine NPE. Die Prüfung ist also

Code:
if (getSelf != null) {
       // getSelf ist nicht null, daher Prüfung, ob es nicht gleich ist.
       if(!getSelf().equals(other.getSelf())) {
           return false;
       }
} else {
       // getSelf ist null, daher ist es nicht gleich, wenn other.getSelf nicht null ist.
       if (other.getSelf() != null) return false;
}

c) Zum Unit Test hat @LimDul schon einen wichtigen Punkt geschrieben. Was da noch wichtig ist, ist, dass Du Dir alle Kominationen aussuchst und testest. Also einfach den Code durchgehen und sicher stellen, dass Du in alle Elemente rein läufst.
- test mit sich selbst (if(this == o))
- test mit null (if (o == null))
- test mit etwas, das keine Instanz von Invocation ist
- test bei getSelf: in beidem null, dann jeweils in einem wird null zurück gegeben, dann beide nicht null aber einmal gleich und einmal nicht gleich ...
- test mit nächstem Element aus Invocation ...

So stellst Du sicher, dass alle Pfade durchlaufen werden ....


Top vielen Dank - hat sehr geholfen!:)

Ich gucke mir das alles noch einmal in Ruhe an^^
 

Zrebna

Bekanntes Mitglied
Update:
Jetzt scheint es erstmal zu passen:
Java:
  @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());
    }

Es kommt auch beim Testen das raus, was raus kommen soll (habe ein paar vorgeschlagene Testcases getestet)
Java:
    @Test
    public void testEquals_BeideNonNull() {
        Invocation object1 = new Invocation("Hello", null, null);
        Invocation object2 = new Invocation("Hello", null, null);
       // Invocation object3 = null;
        boolean result = object1.equals(object2);
        Assert.assertEquals("Objects are not equal", true, result);
      // Assert.assertEquals(object1, object2);

    }

Die Frage von vorher (2 Posts zuvor) bleibt aber irgendwie bestehen:
Offensichtlich habe ich mich um mein Problem nicht zu wissen, wie man hier Methoden- und Object[]-Typen beim Testing initialisiert gedürckt,
indem ich mir etliche Testcase gespart habe, bei denen diese beiden Attribute eben nicht auf null gesetzt sind.
Wie würde es aussehen, wenn ich bei diesen Attributen eben non-null Werte initialisieren will und dafür testen möchte?
 

mrBrown

Super-Moderator
Mitarbeiter
Wie würde es aussehen, wenn ich bei diesen Attributen eben non-null Werte initialisieren will und dafür testen möchte?
Das Method-Objekt musst du dir in dem Fall natürlich schon mit Reflection holen, ähnlich wie du das weiter oben gemacht hast.
Du brauchst aber wirklich nur getMethod/getDeclaredMethod und nimmst dafür am besten bekannte Klassenobjekte (also ohne Class.forName).
Das Objekt-Array soll (soweit ich verstehe) die Argumente für diese Methode darstellen, du musst dir also nur irgendwelche Beispiel-Argumente für die Methode suchen und damit das Array initialisieren.
 

Zrebna

Bekanntes Mitglied
Ach so, ok nun wird es klarer - danke!
Bevor ich es versuche - was wäre denn ein bekanntes Klassenobjekt - sowas wie ArrayList?
Also meinst du etwas "universelles" oder soll ich einfach im Nicht-test-package eine Testklasse erstellen mit einer Methode incl. Beispiel-Parameter und dann auf diese von meiner Testklasse aus zugreifen.

So hast du es nicht gmeint, nehm ich an:

Testklasse:

Java:
public class Greeting {

    private final String str;

    public Greeting(String str) {
        this.str = str;
    }
    
    // method
    public String sayGreeting(String str) {
        return str;
    }
}

Test:
Java:
  @Test
    public void testEquals_BeideNonNull() throws ClassNotFoundException, NoSuchMethodException {
        Class<?> clazz = Class.forName("de.oth.mocker.Greeting");

     //   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);

    }
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Bevor ich es versuche - was wäre denn ein bekanntes Klassenobjekt - sowas wie ArrayList?
Also meinst du etwas "universelles" oder soll ich einfach im Nicht-test-package eine Testklasse erstellen mit einer Methode incl. Beispiel-Parameter und dann auf diese von meiner Testklasse aus zugreifen.
Irgendetwas, was du direkt mit Klassenname.class auflösen kannst :)

Ich würde eher eine eigene Klasse erstellen (die wirst du vermutlich für weitere Tests auch noch brauchen), die gehört dann aber in die Test-Packages, nicht zum normalen Code :)
 

Zrebna

Bekanntes Mitglied
Irgendetwas, was du direkt mit Klassenname.class auflösen kannst :)

Ich würde eher eine eigene Klasse erstellen (die wirst du vermutlich für weitere Tests auch noch brauchen), die gehört dann aber in die Test-Packages, nicht zum normalen Code :)


Ah, du warst schneller (hab obigen Post editiert) - meinst du doch, wie im Post drüber?
 

mrBrown

Super-Moderator
Mitarbeiter
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

Bekanntes Mitglied
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?
 

Zrebna

Bekanntes Mitglied
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;
    }
}
 

Zrebna

Bekanntes Mitglied
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?
 

mrBrown

Super-Moderator
Mitarbeiter
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

Bekanntes Mitglied
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

Super-Moderator
Mitarbeiter
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

Super-Moderator
Mitarbeiter
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

Bekanntes Mitglied
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Gibt es mittlerweile eine Alternative zu DaisyDiff Allgemeine Java-Themen 2
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
W Alternative für Threads Allgemeine Java-Themen 6
Thallius Alternative für SwingWorker Allgemeine Java-Themen 5
J Suche Alternative zu Jasper Reports Allgemeine Java-Themen 4
M Suche Alternative zu JFreeChart Allgemeine Java-Themen 11
D Konstruktor - jedes Objekt einzeln erzeugen - alternative? Allgemeine Java-Themen 8
M DAOs veraltet - was ist die Alternative? Allgemeine Java-Themen 13
MiMa Array umbau oder Alternative? Allgemeine Java-Themen 5
C Alternative zu NetworkX in Java Allgemeine Java-Themen 1
M Alternative zur Serialisierung.. Protobuf? Allgemeine Java-Themen 9
B Alternative zu nebenläufigen Prozessen Allgemeine Java-Themen 4
BonoBoo Alternative zum endlosen Instanzieren Allgemeine Java-Themen 2
F Platzsparende Alternative zu .txt-Dateien Allgemeine Java-Themen 12
E Gewollte Endlosschleife unterbrechen oder Alternative gesucht Allgemeine Java-Themen 2
F Alternative sun.jdbc.odbc.JdbcOdbcDriver (Access Datenbank) Allgemeine Java-Themen 2
F alternative zu "JPEGImageDecoderImpl" Allgemeine Java-Themen 2
T Timer oder Alternative? Allgemeine Java-Themen 3
G Alternative zu .properties Dateien Allgemeine Java-Themen 20
S Alternative zu SortedMap? Allgemeine Java-Themen 8
H Alternative zu Stack Allgemeine Java-Themen 3
pikay Jar2Exe Alternative? Allgemeine Java-Themen 17
E javax.comm: Suche eine open source Alternative zu rxtx Allgemeine Java-Themen 8
H Alternative if Schreibweise mit ? Allgemeine Java-Themen 10
G suche Property alternative Allgemeine Java-Themen 4
H Wie schön oder unschön ist dieser code - alternative ? Allgemeine Java-Themen 5
E Viele if Abfragen auf viele Strings --> Alternative zu if Allgemeine Java-Themen 8
G libext Alternative? Allgemeine Java-Themen 5
S Alternative zu Robot (wegen Umlauten) Allgemeine Java-Themen 13
foobar Alternative zu JavaHelp gesucht Allgemeine Java-Themen 2
I Alternative zu getClass().getResourceAsStream() ? Allgemeine Java-Themen 9
D System.setProperty alternative Allgemeine Java-Themen 4
J alternative zu rsh ? Allgemeine Java-Themen 5
K KeyListener-Alternative ohne anfängliches Delay ? Allgemeine Java-Themen 5
G Alternative zu split() Allgemeine Java-Themen 3
K Alternative zu JNI Allgemeine Java-Themen 3
P Alternative zu replaceAll (jdk < 1.4) Allgemeine Java-Themen 14
M Alternative zu Thread : stop() ? Allgemeine Java-Themen 10
E XML - Datei Darstellung in IntelliJ als Baum Allgemeine Java-Themen 2
G Darstellung von Text auf MapContext von GeoTools Allgemeine Java-Themen 2
J Unicode Darstellung mit 5 chars Allgemeine Java-Themen 9
W Baumstrukturmodell -> Darstellung als TreeView Allgemeine Java-Themen 5
I Fehler bei HashMaps Darstellung Allgemeine Java-Themen 10
krgewb Darstellung bei Java-Update Allgemeine Java-Themen 8
O Darstellung von else if anweisung im struktogramm? Allgemeine Java-Themen 1
F Framework/Plugin für Tree-Darstellung in Graph Allgemeine Java-Themen 0
N Best Practice Flexible String-Darstellung Allgemeine Java-Themen 1
R Bibliothek für Darstellung von char auf 5x7 Dot-Matrix Allgemeine Java-Themen 2
G REST- Object darstellung Allgemeine Java-Themen 6
G Darstellung von Ergebnissen einer Dokumentensuche über eine JTable Allgemeine Java-Themen 19
K Javamail:Probleme mit der Darstellung von Umlaute in Subject Allgemeine Java-Themen 15
D Problem bei der Darstellung einer trigonometrischen Funktion Allgemeine Java-Themen 2
O Problem bei Darstellung der Laufzeit eines Programms Allgemeine Java-Themen 3
C Swing JComboBox - Problem mit der Darstellung des Inhaltes Allgemeine Java-Themen 9
I Teilweise falsche Darstellung jap. Zeichen im JEditorPane mit RTFEditorKit aus RTF-Datei Allgemeine Java-Themen 5
B Darstellung bei verschieden win Systeme spinnt! Allgemeine Java-Themen 2
C Darstellung der Liste bei vielen Daten extrem langsam Allgemeine Java-Themen 11
X CATIA Konstuktionsdaten Import- Darstellung Allgemeine Java-Themen 4
S Darstellung einer dynamischen Matrix Allgemeine Java-Themen 9
J Encoding und Gewinnung von Zeichen aus der Hexa-Darstellung Allgemeine Java-Themen 6
GilbertGrape Darstellung wie in einem Diff-Programm Allgemeine Java-Themen 8
E Hexa-Darstellung Allgemeine Java-Themen 5
M Darstellung von Brüchen Allgemeine Java-Themen 3
B Darstellung von Objekten dauern unterschiedlich lang ! Allgemeine Java-Themen 5
H Unicode Darstellung in Java, spezielles Zeichen gesucht Allgemeine Java-Themen 4
D Double: Grenzen und Darstellung Allgemeine Java-Themen 7
O regulärer Ausdruck zum durchsuchen eines Strings verwenden Allgemeine Java-Themen 2
T Rotationswinkel eines Bildes bestimmen Allgemeine Java-Themen 4
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
M Array Rang eines Elements Allgemeine Java-Themen 4
OnDemand Teile eines Links entfernen Allgemeine Java-Themen 6
H Auslesen eines (LDAP-)Attributs in Active Directory Allgemeine Java-Themen 2
W JSON parsen eines ,mit JS.stringify erstellten Strings Allgemeine Java-Themen 27
H Textposition eines gedrehten Textes verschieben Allgemeine Java-Themen 8
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
E Ersetzen eines Bildes in der Kopfzeile eines Word-Docx-Dokuments mit Apache POI XWPF Allgemeine Java-Themen 0
N Fahrtrichtung eines selbstfahrenden Auto ändern Allgemeine Java-Themen 3
T Letztes Zeichen eines Strings enfernen Allgemeine Java-Themen 14
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
C Koordinaten LONG/LAT eines neuen Punktes in bestimmter Entfernen und Winkel berechnen Allgemeine Java-Themen 3
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Mittelwert anhand eines Stream berechnen Allgemeine Java-Themen 5
kodela Breite eines erweiterten Monitors feststellen Allgemeine Java-Themen 5
R Zeilen eines 2d Arrays abwechselnd links und rechts mit Nullen auffüllen Allgemeine Java-Themen 14
kodela Inhalt eines Arrays ändert sich mysteriös Allgemeine Java-Themen 2
bueseb84 Wget mit Wildcards - oder wie lädt man bei JFrog die letzte Version eines Artifacts herunter Allgemeine Java-Themen 3
N Erkennen eines Programs Allgemeine Java-Themen 2
N Pausieren eines Programmes Allgemeine Java-Themen 4
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
F Wie bekommt man alle Filenamen eines Webserver Verzeichnisses Allgemeine Java-Themen 6
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
N Eigenschaften eines Buttons per Setter verändern Allgemeine Java-Themen 5
S Ausfuehrung eines Programms aufzeichnen..? Allgemeine Java-Themen 4
X Ermittlung eines doppelte Paars mit Streams Allgemeine Java-Themen 50

Ähnliche Java Themen

Neue Themen


Oben