Перегрузка привязок JavaFX

Я связываю две метки, вычисляя значение второй метки через серию вложенных вызовов Bindings.when (). Поскольку я делаю одно и то же 3 раза подряд для трех одинаковых меток, есть ли способ упростить этот код, перегрузив один из методов Bindings или методов IntegerBinding?

private IntegerProperty ipStrength, ipAgility, ipIntelligence;
private IntegerProperty ipStBonus, ipAgBonus, ipInBonus;


public RolePlayingCharacter() {

    ...

    ipStBonus.bind(Bindings.when(ipStrength.lessThan(5))
            .then(-1)
            .otherwise(Bindings.when(ipStrength.lessThan(9))
                    .then(0)
                    .otherwise(Bindings.when(ipStrength.lessThan(11))
                            .then(1)
                            .otherwise(2))));

    ipAgBonus.bind(Bindings.when(ipAgility.lessThan(5))
            .then(-1)
            .otherwise(Bindings.when(ipAgility.lessThan(9))
                    .then(0)
                    .otherwise(Bindings.when(ipAgility.lessThan(11))
                            .then(1)
                            .otherwise(2))));

    ipInBonus.bind(Bindings.when(ipIntelligence.lessThan(5))
            .then(-1)
            .otherwise(Bindings.when(ipIntelligence.lessThan(9))
                    .then(0)
                    .otherwise(Bindings.when(ipIntelligence.lessThan(11))
                            .then(1)
                            .otherwise(2))));

    ...

Я обнаружил, что могу переопределить метод computeValue класса IntegerBinding, но это, похоже, никому не помогает, так как мне все равно придется проделать что-то 3 раза, по одному разу для каждой метки:

    IntegerBinding ibStatBonus = new IntegerBinding() {
        {
            super.bind(ipStrength);
        }

        @Override
        protected int computeValue() {
            int iStatValue = ipStrength.get();
            if (iStatValue < 5) {
                return -1;
            } else if (iStatValue < 9) {
                return 0;
            } else if (iStatValue < 11) {
                return 1;
            } else {
                return 2;
            }
        }
    };

Я хочу сделать что-нибудь простое, например:

    ipStBonus.bind(ipStrength.calculateStatBonus());
    ipAgBonus.bind(ipAgility.calculateStatBonus());
    ipInBonus.bind(ipIntelligence.calculateStatBonus());

Как мне это реализовать? Как сделать метод caclulateStatBonus частью списка методов, доступных для IntegerProperty?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
60
1

Ответы 1

Для этого всегда можно создать вспомогательный метод:

public static IntegerBinding createStatBonusBinding(final IntegerProperty source) {
    return Bindings.createIntegerBinding(() -> {
        int value = source.get();
        if (value < 5) {
            return -1;
        }
        if (value < 9) {
            return 0;
        }
        if (value < 11) {
            return 1;
        }
        return 2;
    }, source);
}
ipStBonus.bind(createStatBonusBinding(ipStrength));
ipAgBonus.bind(createStatBonusBinding(ipAgility));
ipInBonus.bind(createStatBonusBinding(ipIntelligence));

Другие вопросы по теме