Есть ли тип, который будет содержать все возможные ссылки на установщик класса Java независимо от того, какой тип установлен? - PullRequest
0 голосов
/ 09 февраля 2019

Давайте предположим, что у нас есть очень простой класс:

public class User {

    private Long id;
    private String name;

    public void setId(Long id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Я делаю простой класс связывания для заполнения пользователя и хотел бы сообщить о необходимых свойствах.

UserBinder binder = new UserBinder(user)
    .requires(User::setId)
    .requires(User::setName);

Вышеуказанное указывает на то, что оба свойства являются обязательными.Конечно, я мог бы передать значения "id" и "name" вместо ссылок на методы.Но кажется, что передача установщика очень уместна, так как этот установщик должен вызываться внутри связывателя.

Следующее прекрасно работает:

public void requires(BiConsumer<User, Long> r) // for User::setId;
public void requires(BiConsumer<User, String> r) // for User::setName;

Но следующее не получается:

public void requires(BiConsumer<User, ?> r)

Существует ли тип, который будет содержать все возможные ссылки на установщики класса java независимо от устанавливаемого типа?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Вы можете связать тип, возможно, используя:

<T> void requires(BiConsumer<User, T> r) {
}

Кроме того, если бы вы указали только эти параметры, вы могли бы создать собственный конструктор для обязательных полей как:

public User(Long id, String name)

чтобы экземпляр объекта имел эти атрибуты.

0 голосов
/ 09 февраля 2019

Вы можете добавить универсальный параметр к методу requires:

public <T> void requires(BiConsumer<User, T> consumer)

Теперь это:

new UserBinder(new User())
    .requires(User::setName);

компилируется нормально.


Вы сказали, что вам нужно хранить полученных потребителей в какой-то коллекции и проверить, содержит ли коллекция какую-либо consumer

К сожалению, вы не можете сделать это легко (см. Этот вопрос ).

В качестве обходного пути вы можете создать @FunctionalInterface расширение Serializable с той же сигнатурой метода, что и в BiConsumer, и сравнить сериализованные байты.См. этот ответ .Но помните, что вы не можете полагаться на это поведение

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