Добавление пользовательских методов в класс Java BooleanProperty - PullRequest
0 голосов
/ 23 марта 2020

Мне нравится использовать классы Property, но я не фанат того, как долго нужно предложение, чтобы делать простые вещи.

Я хотел расширить класс SimpleBooleanProperty, чтобы вместо необходимости что-то делать как это:

myProperty.setValue(!myProperty.getValue());

Я мог бы просто сделать это:

myProperty.flip();

ТАК, я пытался расширить SimpleBooleanClass, но он не работает.

Вот моя попытка сделать это с соответствующими результатами, опубликованными ниже:

import javafx.beans.InvalidationListener;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;

public class CBP extends SimpleBooleanProperty {
    @Override public void bind(ObservableValue<? extends Boolean> observable) {}
    @Override public void unbind() {}
    @Override public boolean isBound() {return false;}
    @Override public Object getBean() {return null;}
    @Override public String getName() {return null;}
    @Override public boolean get() {return false;}
    @Override public void set(boolean value) {}
    @Override public void addListener(ChangeListener<? super Boolean> listener) {}
    @Override public void removeListener(ChangeListener<? super Boolean> listener) {}
    @Override public void addListener(InvalidationListener listener) {}
    @Override public void removeListener(InvalidationListener listener) {}

    public void flip(){
        super.setValue(!super.getValue());
    }
}

Эта попытка использовать это произвела вывод как показано:

CBP cbp = new CBP();
cbp.setValue(true);
if (cbp.getValue().equals(true)) System.out.println("TRUE"); else System.out.println("FALSE");
cbp.flip();
if (cbp.getValue().equals(true)) System.out.println("TRUE"); else System.out.println("FALSE");

Это вывод:

FALSE
FALSE

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 23 марта 2020

Метод setValue() ожидает обернутый логический объект. Под капотом он использует get(), чтобы развернуть значение. Поэтому, когда вы используете setValue(true), ваш примитив автоматически упаковывается в логический объект со значением true. Затем SimpleBooleanProperty использует .get(), чтобы развернуть объект в примитив. У вас есть get() переопределенный, чтобы всегда возвращать false.

Если вы пройдете через свою программу, вы увидите, что при выполнении setValue(true) значение фактически устанавливается как false из-за этого.

0 голосов
/ 23 марта 2020

Исходя из того, что @scgrk опубликовал в качестве ответа, я просто изменил эти @overrides, и теперь все работает, как задумано. Моя IDE автоматически заполнила эти переопределения, и я подумал, что внимательно посмотрел на них, но я ошибся.

Спасибо, scgrk, что указал мне правильное направление.

@Override public void unbind     ()      {super.unbind();}
@Override public boolean isBound ()      {return super.isBound();}
@Override public Object getBean  ()      {return super.getBean();}
@Override public String getName  ()      {return super.getName();}
@Override public boolean get     ()      {return super.get();}
@Override public void set(boolean value) {super.set(value);}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...