OK, let's wait with this until I figure out if there's a problem with the
test suit.

On Fri, Feb 16, 2018 at 11:46 PM, Kevin Rushforth <
kevin.rushfo...@oracle.com> wrote:

> This will take me a bit more time to look at than I have right now (and
> Monday is a US holiday), so one quick comment for now:
>
> The refactoring must not alter any public API signatures for exported
> packagers, and must be behavior neutral. So if there are unit tests that
> pass without your fix and fail with your fix, then you will need to alter
> your fix, unless you can show that the tests are testing an implementation
> detail that would not affect an application that just uses public API.
>
>
> -- Kevin
>
>
> Nir Lisker wrote:
>
> Let's start with the refactoring then. Before I submit a bug let's check
> that this plan makes sense. Attached webrev for discussion.
>
> Changes:
> * Main change was to the XxxCondition classes. Instead of having 4
> combinations of primitives and observables I used the unification approach
> that NumberConditionBuilder took with wrapping the value in a constant
> observable. I also replaced these classes with a generic wrappers
> XxxConditionHolders which hold the binding part of the XxxCondition class.
>
> * I attempted to generify XxxConditionBuilders as well. The attempt is
> ConditionBuilder and an example implementation was done for boolean only -
> BooleanConditionBuilder2. I think that it doesn't gain much.
>
> * Added BooleanConstant class in internal API (it was missing for some
> reason).
>
> * The handling of Numbers in the original class is a bit weird in my eyes.
> The compile time return types are DoubleBinding if one or both values are
> double and NumberBinding otherwise [1]. On the other hand, the runtime
> return types takes special care to return a binding class based on widening
> conventions and the docs don't mention anything about that. In my change,
> the runtime type is always DoubleBinding (though I kept a placeholder
> if-else chain) and that saves some code. The user can always call
> floatValue() etc. anyway.
>
> Between backwards compatibility and limitations of generics this is the
> best I could come up with.
>
> Additional notes:
>
> * Running the tests from gradle causes some of the When tests to fail and
> I don't know why, it's hard to debug. I wrote my own ad-hoc test for one of
> the failed tests and it passes.
>
> * I noticed that StringConstant extends StringExpression while all the
> other classes just implement their respective ObservableXxxValue. Don't
> know why, but I can align these classes to one of those choices.
>
> [1] https://docs.oracle.com/javase/9/docs/api/javafx/beans/binding/When.
> NumberConditionBuilder.html
>
> On Thu, Feb 15, 2018 at 5:04 AM, Kevin Rushforth <
> kevin.rushfo...@oracle.com> wrote:
>
>> Sorry for the delay in responding. I was traveling when this was sent and
>> barely able to keep up with urgent email / tasks.
>>
>> Most of what you suggest below seems good. My only concern is whether the
>> "on demand" evaluation will have any side effects. Conceptually, it seems
>> like the right thing to do.
>>
>> The refactoring you propose is probably best done as a separate bug fix,
>> so that we don't mix behavioral changes with refactoring, unless you think
>> that the refactoring is intertwined with the fix.
>>
>> If you would like to work on a fix, that would be good. It will need to
>> include new unit tests, plus ensuring that the existing unit tests pass.
>>
>> Thanks.
>>
>> -- Kevin
>>
>>
>>
>> Nir Lisker wrote:
>>
>>> Hi,
>>>
>>> I was looking at https://bugs.openjdk.java.net/browse/JDK-8089579, which
>>> prompted me to have a look at When. There are a few points I would like
>>> to
>>> address:
>>>
>>> * StringConditionBuilder#otherwise(ObservableStringValue) does not check
>>> for null as other condition builders do. This results in a deeper NPE
>>> when StringCondition tries to register a listener to the
>>> ObservableStringValue.
>>>
>>> * I would like a (re)evaluation on the above bug ticket and thoughts on
>>> the
>>> proposal of "on demand evaluation" using a Supplier or a similar method.
>>> The behavior of the intended implementation would be to evaluate 'then'
>>> and
>>> 'otherwise' whenever their condition is met, and only then.
>>>
>>> * The class can benefit from some small refactoring, such as using
>>> Objects.requireNonNull for null checks and some code reuse to reduce the
>>> chance of bugs such as the missing null check of StringConditionBuilder.
>>>
>>> * There are a few Javadoc corrections and some clarifications of the
>>> current behavior could be beneficial as well.
>>>
>>> I can work on all of the above. How to proceed?
>>>
>>> - Nir
>>>
>>>
>>
>

Reply via email to