Enums > O valor do parametro vira null

Olá pessoal… to com um problema… O meu sistema de bonus das tropas não funciona:

  public static enum Type{
    BLADE ( "Blade", Bonuses.BLADE_BONUS ),
    SPEAR ( "Spear", Bonuses.SPEAR_BONUS ),
    SHOCK ( "Shock", Bonuses.SHOCK_BONUS ),
    MOUNTED ( "Mounted", Bonuses.MOUNTED_BONUS ),
    RANGE ( "Range", Bonuses.RANGE_BONUS ),
    LIGHT ( "Light Armour", Bonuses.LIGHT_BONUS ),
    MEDIUM( "Medium Armour" ),
    HEAVY( "Heavy Armour", Bonuses.HEAVY_BONUS );
    public final String name;
    public final ArrayList< Bonuses > typeBonuses = new ArrayList< Bonuses >();
    private Type( String name, Bonuses... b ){
      this.name = name;
      for ( Bonuses bn : b ) typeBonuses.add( bn );
    }
    public static enum Bonuses{
      BLADE_BONUS( SPEAR, Parameter.DEXTRIBILITY, false, 9 ),
      SPEAR_BONUS( MOUNTED, Parameter.STRENGTH, false, 0.75 ),
      SHOCK_BONUS( HEAVY, Parameter.DEXTRIBILITY, false, 0.5 ),
      MOUNTED_BONUS( BLADE, Parameter.STRENGTH, false, 0.5 ),
      RANGE_BONUS( LIGHT, Parameter.STRENGTH, false, 0.25 ),
      LIGHT_BONUS( SHOCK, Parameter.DEXTRIBILITY, false, 0.25 ),
      HEAVY_BONUS( RANGE, Parameter.ARMOUR, false, 0.25 );
      public final Type t;
      public final Parameter p;
      public final boolean add;
      public final double amount;
      private Bonuses( Type t, Parameter p, boolean add, double amount ){
        this.t = t;
        System.out.println( t );
        this.p = p;
        this.add = add;
        this.amount = amount;
      }
    }
    public double getBonuses( Parameter kind, Type enemyType, boolean add ){
      double b = 0;
      for ( int a = 0 ; a < typeBonuses.size() ; a++ ){
        System.out.println( "GetBonuses - Checking Bonus of " +
                typeBonuses.get(a) + " vs " + enemyType );
        Bonuses bn = typeBonuses.get(a);
        if( bn.p == kind && bn.t == enemyType && bn.add == add) b += bn.amount;
      }
      return b;
    }
  }

O problema tá ai:
O campo t dos bonuses fica null :frowning: Levei horas pra descobrir, mais fica sim. Não sei pq, por favor ajudem =)
Se prescisar eu posto o resto do código da classe, mais é bem extenso, acho que não prescisa.

Obs: Ignorem o 9 no bonus do BLADE, coloquei um valor absurdo pra testar se não funcionava msm

no construtor bonuses tentei até mandar imprimir na tela Type.BLADE e dá null !
Please help to ficando desesperado

Pelo amor…

Rapaz, todo essa código está em um arquivo?
Pq suas enums são estáticas?
Você está criando enums com enums???
Você está criando um tipo de referência circular… Type tem Bonuses e vice versa… Pq???
Porque enums e não classes e instâncias para modelar o que precisa?
E esses atributos public final???

Isso é só uma parte do código. Todas estão dentro de uma classe. As referencias circulares são necessárias, o tipo BLADE tem um bônus contra SPEAR e etc.
So que fica que o tipo Blade tem um bonus contra null. :frowning:
Usei enums pq elas possuem um número fixo de instancias

De fato, referências circulares e enums são coisas que não se misturam muito bem. Leia no blog do Neal Gafter (não sei mais em que página isso foi, já que ele está bloqueado aqui no proxy - http://gafter.blogspot.com - ) um artigo sobre como resolver isso.