Ich verwende Java 8 und Spring. Vor kurzem hatte ich ein seltsames (für mich) Problem. Grundsätzlich habe ich zwei Klassen: 1. Es ist eine Basisklasse:gleich zwischen Basis und erweiterte Klasse funktioniert nicht richtig
public BaseClass {
private int variableA;
public BaseClass() {
/* this is an empty costructor */
}
public BaseClass(int a) {
this.variableA = a;
}
/* getter and setter method */
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
BaseClass that = (BaseClass) o;
/* (HERE) */
return variableA == that.variableA;
}
}
2. Eine @Configuration-Klasse, die die Basisklasse erweitert:
@Configuration
@ConfigurationProperties(prefix = "config")
@RefreshScope //org.springframework.cloud.context.config
public MyClass extends BaseClass {
private int variableB;
/* getter and setter method */
}
Alles, was ich will, ist zu prüfen, ob Zwei Klassen sind gleich, wobei nur Variablen in baseClass berücksichtigt werden. Beispielverfahren
public boolean areTheyEqual(BaseClass a, MyClass b) {
return a.equals(b);
}
Bei dem Verfahren areTheyEqual
die Klassen a
b
und korrekt gefüllt sind. Wenn Sie BaseClass.equals
zu Zeile schauen, wo (HERE)
geschrieben wird: In diesem Punkt habe ich einige BaseClass
erstellt von MyClass
. Es ist kein NullPointer, aber variableA
ist gleich 0 (in MyClass wurde auf einen Wert gesetzt). Ich weiß nicht warum!
aber
wenn ich ändern die Methode areTheyEqual
zu:
public boolean areTheyEqual(BaseClass a, MyClass b) {
return a.equals(new BaseClass(b));
}
alles funktioniert. Ich bin wirklich neugierig, warum ist das so? Ist es ein Problem, dass ich unter Verwendung equals
@Configuration-Klasse MyClass auf Objekt und dann auf BaseClass umwandeln?
EDIT 1: Beispiel:
@Component
public class Example {
private MyClass myClass;
private BaseClass baseClass;
@Autowired
public Example(MyClass myClass) {
this.myClass = myClass;
this.baseClass = new BaseClass(myClass);
}
@Scheduled
private void checkMe() {
if(!areTheyEqual()) {
/* do something */
}
}
private boolean areTheyEqual() {
/* baseClass.variableA == 2 AND myClass.variableA == 2 */
return baseClass.equals(myClass);
}
}
In meiner Frage ist nicht wichtig, was equals
Implementierung ist (btw Methode von IntelliJ erzeugt wird).
Meine Definition von 'funktioniert' ist: 1. Wenn variableA
in Baseclass ist die gleiche wie variableA
in myClass dann equals
true zurück 2. Wenn nicht 1. dann falsch
können Sie uns den Equals-Code zeigen pls –
Wir können dies nicht beantworten, weil es zu viel Code fehlt, und wir wissen nicht, was Ihre Definition von "funktioniert gut" ist. Was meinst du mit "in' MyClass' wurde es auf einen Wert gesetzt "? Wo war es und wie? Deine Frage ist völlig unklar. – ajb
Zeigen Sie Ihre equals-Methode in 'BaseClass' an. – additionster