Методы хранения идентифицируемы в Java - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь найти решение проблемы, когда я хочу каким-то образом хранить ссылки на методы, чтобы я мог вызывать их, когда это необходимо, и удалять их, когда они мне не нужны в моем списке методов.

Основная цель здесь выглядит примерно так:

У меня есть класс 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.

Не хватает ли мне лучшего решения здесь?

1 Ответ

1 голос
/ 21 июня 2020

Лучшим решением будет:

public class Person {
    private String ref, name;
    private Person father;
    private List<Person> children;

    ... a lot of obvious stuff here ...
}

Теперь, когда вы удаляете Person, вы можете посмотреть на father этого человека, а затем удалить Person из списка * 1007 отца. *, а также посмотрите на children удаленного человека и установите для father значение null. Если вы хотите узнать ссылку отца, просто введите father.ref или getFather().getRef().

Я чувствую, что вы не хотите этого делать по какой-то причине, например, грязный или нет OOP или что-то вроде который. Но это решение, которое лучше всего использует возможности языка и библиотеки времени выполнения.

Другие решения, как правило, представляют собой более сложные способы сделать это. В вашем примере, вместо того, чтобы иметь член children, вы создали отдельный HashMap, в котором ключом является ссылка отца, а значение - массив методов установки, но вы видите, что это то же самое: для Для всех отношений между ребенком и отцом в списке есть запись, связанная с отцом. для человека, которого удаляют, было бы просто проверить, указывает ли поле father на этого человека. Метод установки все еще будет в списке и все равно будет вызываться, но он не нанесет никакого ущерба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...