mardi 5 mai 2020

Java - different behaviours between if-else and ternary operator

Recently I discovered a strange behaviour difference between if-else and the ternary operator.

I am going to illustrate the difference using unit test code below.

public class SomeTest {

    @Test
    void testWithTernary_resultIsLong() {
        final SomeClass someClass = new SomeClass();
        assertTrue(someClass.getNumberWithTernary() instanceof Long);
        assertFalse(someClass.getNumberWithTernary() instanceof Integer);
    }

    @Test
    void testWithIfElse_resultIsInteger() {
        final SomeClass someClass = new SomeClass();
        assertTrue(someClass.getNumberWithIfElse() instanceof Integer);
        assertFalse(someClass.getNumberWithIfElse() instanceof Long);
    }

    private static class SomeClass {

        public Object getNumberWithTernary() {
            final long l = this.getLong();
            return (l >= Integer.MIN_VALUE && l <= Integer.MAX_VALUE) ? Math.toIntExact(l) : l;
        }

        private long getLong() {
            return 10L;
        }

        public Object getNumberWithIfElse() {
            final long l = this.getLong();
            if (l >= Integer.MIN_VALUE && l <= Integer.MAX_VALUE) {
                return Math.toIntExact(l);
            } else {
                return l;
            }
        }
    }
}

Both the tests above succeed.

I am using latest version of java 8.

Aucun commentaire:

Enregistrer un commentaire