Nie jestem pewien, w jaki sposób mogę być pewien równości/niezmienności interfejsu funkcjonalnego. Sądzę, że nie ma sposobu, aby zapewnić równość, gdy używam tego cukru syntaktycznego w języku Java 8, proszę dać mi znać, jeśli masz jakieś.Równość wystąpienia interfejsu funkcjonalnego w java
Zrobiłem krótki fragment kodu dla mojego pytania.
public interface Element {
void doSomething(int a);
}
i starałem się dodać instancję tego interfejsu w sposób funkcjonalny
public class FunctionSet {
public void doubleUp(int a) {
System.out.println(a*2);
}
public void square(int a) {
System.out.println(a*a);
}
public static void main(String[] args) {
HashSet<Element> set = new HashSet<>();
FunctionSet functionSet = new FunctionSet();
set.add(functionSet::doubleUp);
set.add(functionSet::square);
System.out.println(set.add(functionSet::doubleUp));
}
}
drukuje prawda co oznacza, że nie było żadnych sprawdzenie równości i również nie mogę usunąć instancję z zestawu po dodaniu go.
jeśli używam interfejsu funkcjonalnego jako argumentu, czy jest jakiś sposób, aby jakoś porównać te instancje?
docenią każdą pomoc, z góry dzięki!
zmienność jest określana przez państwo. Gdy obiekt nie ma stanu (tj. Gdy nie ma pól instancji), nie można go zmienić. Obiekty bezpaństwowe, takie jak większość (wszystkie?) Lambdy, są zatem zawsze niezmienne. Obiekty trwałe mogą i powinny być pojedynczymi, ponieważ ich stan nigdy się nie zmienia, ale możliwe jest posiadanie dwóch identycznych niemodyfikowalnych obiektów na różnych adresach pamięci ... co dałoby dwa równoważne obiekty o odrębnej tożsamości. – scottb
Krótka odpowiedź: Nie, nie możesz przetestować dwóch lambd z różnych lokalizacji kodu dla równości. –
@Louis Wasserman: lokalizacja kodu nie ma znaczenia, prawidłowa odpowiedź jest taka, że nie można przetestować dwóch lambd dla równości, nawet jeśli utworzono instancję w tym samym miejscu kodu. Chociaż może się wydawać, że działa w niektórych przypadkach, jest to zachowanie zależne od implementacji. – Holger