Extending enums in IDL
Jan Holesovsky
kendy at collabora.com
Wed Nov 23 11:04:52 UTC 2016
Hi Eike,
Eike Rathke píše v Út 22. 11. 2016 v 21:43 +0100:
> For Java, receiving an unknown UNO API enum value results in a null
> value. That can happen if an external Java process not knowing about the
> new enum value using older LO jar files connects against a LibreOffice
> process.
I heard this argument several times before, but did not actually care
enough to dig deeper into it; I just assumed that Java has some kind of
'enum' type that we use in the java bindings, and Things Break Horribly
(TM).
But you caught my interest now - so if I understand that correctly, it
is not a terrible breakage what's going on here: The client just gets an
unknown value; ie. the same thing as when we add a constant to the IDL,
and return this unknown new value - right?
I had a look what we actually do with the 'enum'; it's the following:
> javap workdir/CustomTarget/unoil/javamaker/com/sun/star/sheet/GeneralFunction.class
public final class com.sun.star.sheet.GeneralFunction extends
com.sun.star.uno.Enum {
public static final com.sun.star.sheet.GeneralFunction NONE;
public static final int NONE_value;
public static final com.sun.star.sheet.GeneralFunction AUTO;
public static final int AUTO_value;
[...]
public static com.sun.star.sheet.GeneralFunction getDefault();
public static com.sun.star.sheet.GeneralFunction fromInt(int);
}
So it is subclassed from
ridljar/com/sun/star/uno/Enum.java
which does not even indicate we'd get a null, but only the (unknown)
value.
For comparison, the constants look like this:
> javap workdir/CustomTarget/unoil/javamaker/com/sun/star/sheet/ConditionEntryType.class
public interface com.sun.star.sheet.ConditionEntryType {
public static final int COLORSCALE;
public static final int CONDITION;
public static final int DATABAR;
public static final int DATE;
public static final int ICONSET;
}
>From all this, it seems to me that adding a new value to the enum is no
different than adding a new constant: in both cases the client just gets
a value it does not understand, and has to deal with that.
Of course - adding the value in the middle of the enum is a different
story, as the rest of it gets renumbered (which _is_ a real problem, and
should be avoided), but adding at the end seems to me like something we
shouldn't be afraid of - it's just the same as adding a new constant.
Or am I missing anything?
Thank you,
Kendy
More information about the LibreOffice
mailing list