Я пытаюсь найти решение проблемы, когда я хочу каким-то образом хранить ссылки на методы, чтобы я мог вызывать их, когда это необходимо, и удалять их, когда они мне не нужны в моем списке методов.
Основная цель здесь выглядит примерно так:
У меня есть класс Person:
public class Person {
private String ref, name;
private String fatherRef; // can be reference string (such as "#1#") or a literal text (such as "the guy next door")
public Person(String ref, String name) {
this.ref = ref;
this.name = name;
}
public String getFatherRef() {return fatherRef;}
public void setFatherRef(String ref) {
fatherRef = ref;
}
...
}
Я делаю 2 экземпляра отца и сына и устанавливаю ссылку отца как FatherRef для сына, используя метод setFatherRef . Я держу их обоих в списке. Теперь предположим, что объект отца удален из системы, и его ссылка становится доступной для другого человека. Чтобы убедиться, что отец не упоминается в объекте сына после его удаления, я придумал следующее:
Я создал interface IRefSetter {public void setRef(String ref);}
и использовал его для создания методов ArrayList<IRefSetter>
(например, setFatherRef
или setMotherRef
, et c.) и сопоставил этот список, используя ссылку отца, на HashMap<String,ArrayList<IRefSetter>>
, чтобы в любое время, когда я избавляюсь от любого человека, я мог посмотреть на его ссылку и посмотреть, сопоставлен ли он со списком методов, которые я могу использовать для установки их refs для всех остальных Person
s равными null или "".
В этом примере карта будет иметь только одно отображение ссылки отца на список, содержащий единственный метод, ссылающийся setFatherRef
из класса Person
. Теперь это сработает, но скажем, что я установил для отца ссылку на чью-то ссылку и добавлю ссылку на метод для этого нового человека так же, как и с исходным отцом. Но теперь у меня осталось HashMap
, содержащее под исходной ссылкой отца список, в котором у меня хранится метод сброса параметра «отец» сына в случае удаления исходного отца. Но в этом больше нет необходимости, поскольку у сына теперь другой отец с другим номером.
Я не вижу простого способа определить, какой метод в моем списке - son::setFatherRef
, потому что лямбда функция, которая создается каждый раз, когда я ссылаюсь на метод, отличается.
С этого момента я начал искать очень уродливое решение, в котором вместо хранения лямбда-функций, соответствующих моему исходному интерфейсу IRefSetter
, я сохраняю Object
ссылка на (в данном случае) экземпляр Person
сына и имя метода как String
вместе с ним и попытка вручную сопоставить правильный метод с моим IRefSetter
интерфейсом (используя Class
и Method
классы). Но это очень уродливое решение, которое вместо ошибок компилятора приведет к ошибкам времени выполнения, которые мне не нравятся, и все это не кажется мне очень OOP.
Не хватает ли мне лучшего решения здесь?