![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
I wonder how obvious or how stupid or how ubiquitous is the following trick:
Say, I have an enum somewhere outside of my realm:
and my method takes an instance of that enum, and I really do not like switching based on the enum; of course I can have an
(PURPLE STUFF ADDED LATER)
Is not it a poetry? :)
Say, I have an enum somewhere outside of my realm:
enum DataType {
PERSONAL, COMMUNITY, PRISON, ARMY;
};
....
and my method takes an instance of that enum, and I really do not like switching based on the enum; of course I can have an
EnumMap
, but the funny trick is that my strategies are based on this enum type, so I can do just this:
enum Strategy {
PERSONAL {
public void process(Entity entity) {...};
},
COMMUNITY {
public void process(Entity entity) {...};
},
PRISON {
public void process(Entity entity) {...};
},
ARMY {
public void process(Entity entity) {...};
}
abstract public void process(Entity entity);
DEFAULT{
public void process(Entity entity) {...};
};
abstract public void process(Entity entity);
(and so on, add functionality here )
Strategy forDataType(DataType type) {
Strategy candidate = valueOf(type.name());
return candidate == null ? DEFAULT : candidate;
}
};
....
Strategy.forDataType(myType).process(myEntity);
(PURPLE STUFF ADDED LATER)
Is not it a poetry? :)
no subject
Date: 2007-05-26 10:38 pm (UTC)Быстродействие, связанное с перебором внутри valueOf(), игнорируем. Понятно, что количество элементов будет измеряется десятками, да и время выполнения стратегии достточно велико, чтобы время выбора стратегии было несущественно.
Но синтаксически не очень красиво смотрится размещение кода внутри enum. Для компактности Strategy.process() может вызывать один из методов personal(), community() и т.п. Но в таком случае, наверное, проще искать нужный метод через рефлексию, обойдясь без лишнего enum и встроив этот поиск прямо в process().