L
Laura Schmidt
Hi,
I have found a need to extend enum, but this is not possible in java.
Take a look at the situation:
In an application, there is an enum ListCommand that enumerates the
commands a user may execute on list entries:
public enum ListCommand
{
OPEN,
EDIT,
DELETE;
}
There is an interface that uses this enum:
public interface ListCommandProcessor
{
void onListCommand (ListCommand cmd);
}
And there is a generic Listing class that is used to show customized
lists in the GUI and which uses the above interface:
public class Listing<T>
{
...
ListCommandProcessor processor;
...
}
So far, so good.
Now I am making a cut: The generic class Listing<T> should be moved into
a generic java library, so that it can be used by different
applications. So I also need to move the interface ListCommandProcesor
into this library, and this would implicate that I also move the enum
ListCommand into the library. But the enum ListCommand ist application
specific. If I move it to the library, it must be extendable somehow. If
there were no limitations in the java language, I would separate the
concerns of library and application like this:
--- library:
public enum ListCommand
{
// empty at library level
}
public interface ListCommandProcessor
{
void onListCommand (ListCommand cmd);
}
--- application:
public enum AppListCommand extends ListCommand
{
OPEN,
CLOSE,
SOMETHINGSPECIAL;
}
public class MyApp extends ListCommandProcessor
{
...
Listing<XYZ> listing = new Listing<XYZ> ();
listing.setProcessor (this);
public void onListCommand (ListCommand cmd)
{
AppListCommand c = (AppListCommand) cmd;
switch (c)
{
...
}
}
}
This would be my solution, but it is not possible in java to extend
enums. But I need to make a cut somewhere in order to move Listing<T>
into the generic library. The only solution I can imagine is to change
onListCommand (ListCommand cmd);
into
onListCommand (int cmd);
But then I would loose the beautiful type binding and I will soon find
myself defining list commands like it was done in the 90's in C:
public static final int CMD_OPEN = 1;
public static final int CMD_EDIT = 2;
public static final int CMD_DELETE = 3;
public static final int CMD_SOMETHINGSPECIAL = 55;
I know that this would be a way out, but I want to make sure that there
is no better solution.
How would you do this?
Thank you,
Laura
I have found a need to extend enum, but this is not possible in java.
Take a look at the situation:
In an application, there is an enum ListCommand that enumerates the
commands a user may execute on list entries:
public enum ListCommand
{
OPEN,
EDIT,
DELETE;
}
There is an interface that uses this enum:
public interface ListCommandProcessor
{
void onListCommand (ListCommand cmd);
}
And there is a generic Listing class that is used to show customized
lists in the GUI and which uses the above interface:
public class Listing<T>
{
...
ListCommandProcessor processor;
...
}
So far, so good.
Now I am making a cut: The generic class Listing<T> should be moved into
a generic java library, so that it can be used by different
applications. So I also need to move the interface ListCommandProcesor
into this library, and this would implicate that I also move the enum
ListCommand into the library. But the enum ListCommand ist application
specific. If I move it to the library, it must be extendable somehow. If
there were no limitations in the java language, I would separate the
concerns of library and application like this:
--- library:
public enum ListCommand
{
// empty at library level
}
public interface ListCommandProcessor
{
void onListCommand (ListCommand cmd);
}
--- application:
public enum AppListCommand extends ListCommand
{
OPEN,
CLOSE,
SOMETHINGSPECIAL;
}
public class MyApp extends ListCommandProcessor
{
...
Listing<XYZ> listing = new Listing<XYZ> ();
listing.setProcessor (this);
public void onListCommand (ListCommand cmd)
{
AppListCommand c = (AppListCommand) cmd;
switch (c)
{
...
}
}
}
This would be my solution, but it is not possible in java to extend
enums. But I need to make a cut somewhere in order to move Listing<T>
into the generic library. The only solution I can imagine is to change
onListCommand (ListCommand cmd);
into
onListCommand (int cmd);
But then I would loose the beautiful type binding and I will soon find
myself defining list commands like it was done in the 90's in C:
public static final int CMD_OPEN = 1;
public static final int CMD_EDIT = 2;
public static final int CMD_DELETE = 3;
public static final int CMD_SOMETHINGSPECIAL = 55;
I know that this would be a way out, but I want to make sure that there
is no better solution.
How would you do this?
Thank you,
Laura