Api-based SpellEffects and Ai classes are all stateless (except the one for tokens) - this allows me to pre-create their instances in ApiType enum members and use same instance multiple times.

This commit is contained in:
Maxmtg
2013-06-01 13:11:58 +00:00
parent bfa1379265
commit e561713058
2 changed files with 17 additions and 5 deletions

View File

@@ -207,7 +207,7 @@ public enum ApiType {
TapAll (TapAllEffect.class, TapAllAi.class),
TapOrUntap (TapOrUntapEffect.class, TapOrUntapAi.class),
TapOrUntapAll (TapOrUntapAllEffect.class, TapOrUntapAllAi.class),
Token (TokenEffect.class, TokenAi.class),
Token (TokenEffect.class, TokenAi.class, false), // Token AI and effect classes have state, they have to be re-created on each request
TwoPiles (TwoPilesEffect.class, TwoPilesAi.class),
UnattachAll (UnattachAllEffect.class, UnattachAllAi.class),
Untap (UntapEffect.class, UntapAi.class),
@@ -221,12 +221,24 @@ public enum ApiType {
private final Class<? extends SpellAbilityEffect> clsEffect;
private final Class<? extends SpellAbilityAi> clsAi;
private final SpellAbilityEffect instanceEffect;
private final SpellAbilityAi instanceAi;
private static final Map<String, ApiType> allValues = new TreeMap<String, ApiType>(String.CASE_INSENSITIVE_ORDER);
ApiType(Class<? extends SpellAbilityEffect> clsEf, Class<? extends SpellAbilityAi> clsAI) {
ApiType(Class<? extends SpellAbilityEffect> clsEf, Class<? extends SpellAbilityAi> clsAi) {
this(clsEf, clsAi, true);
}
ApiType(Class<? extends SpellAbilityEffect> clsEf, Class<? extends SpellAbilityAi> clsAI, final boolean isStateLess) {
clsEffect = clsEf;
clsAi = clsAI;
instanceAi = isStateLess ? ReflectionUtil.makeDefaultInstanceOf(clsAi) : null;
instanceEffect = isStateLess ? ReflectionUtil.makeDefaultInstanceOf(clsEf) : null;
}
public static ApiType smartValueOf(String value) {
@@ -241,11 +253,11 @@ public enum ApiType {
}
public SpellAbilityEffect getSpellEffect() {
return clsEffect == null ? null : ReflectionUtil.makeDefaultInstanceOf(clsEffect);
return instanceEffect != null ? instanceEffect : ReflectionUtil.makeDefaultInstanceOf(clsEffect);
}
public SpellAbilityAi getAi() {
return clsAi == null ? null : ReflectionUtil.makeDefaultInstanceOf(clsAi);
return instanceAi != null ? instanceAi : ReflectionUtil.makeDefaultInstanceOf(clsAi);
}
}

View File

@@ -20,7 +20,7 @@ import forge.gui.GuiChoose;
*/
public class TapOrUntapAllEffect extends SpellAbilityEffect {
private enum TapOrUntap {
private static enum TapOrUntap {
TAP, UNTAP
}