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), TapAll (TapAllEffect.class, TapAllAi.class),
TapOrUntap (TapOrUntapEffect.class, TapOrUntapAi.class), TapOrUntap (TapOrUntapEffect.class, TapOrUntapAi.class),
TapOrUntapAll (TapOrUntapAllEffect.class, TapOrUntapAllAi.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), TwoPiles (TwoPilesEffect.class, TwoPilesAi.class),
UnattachAll (UnattachAllEffect.class, UnattachAllAi.class), UnattachAll (UnattachAllEffect.class, UnattachAllAi.class),
Untap (UntapEffect.class, UntapAi.class), Untap (UntapEffect.class, UntapAi.class),
@@ -221,12 +221,24 @@ public enum ApiType {
private final Class<? extends SpellAbilityEffect> clsEffect; private final Class<? extends SpellAbilityEffect> clsEffect;
private final Class<? extends SpellAbilityAi> clsAi; 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); 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; clsEffect = clsEf;
clsAi = clsAI; clsAi = clsAI;
instanceAi = isStateLess ? ReflectionUtil.makeDefaultInstanceOf(clsAi) : null;
instanceEffect = isStateLess ? ReflectionUtil.makeDefaultInstanceOf(clsEf) : null;
} }
public static ApiType smartValueOf(String value) { public static ApiType smartValueOf(String value) {
@@ -241,11 +253,11 @@ public enum ApiType {
} }
public SpellAbilityEffect getSpellEffect() { public SpellAbilityEffect getSpellEffect() {
return clsEffect == null ? null : ReflectionUtil.makeDefaultInstanceOf(clsEffect); return instanceEffect != null ? instanceEffect : ReflectionUtil.makeDefaultInstanceOf(clsEffect);
} }
public SpellAbilityAi getAi() { 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 { public class TapOrUntapAllEffect extends SpellAbilityEffect {
private enum TapOrUntap { private static enum TapOrUntap {
TAP, UNTAP TAP, UNTAP
} }