为什么在数组列表中添加新元素会将所有先前元素替换为新元素?

时间:2013-09-30 06:18:07

标签: java

我的班级TextPlan中有一个方法,它在另一个班级RSTRule中调用我的所有规则,并将所有规则添加到数组列表中。对于这个方法我使用了import java.lang.reflect.InvocationTargetException and import java.lang.reflect.Method . But it adds to the array list incorrectly. For example, the result of add(RSTRule)`在RST方法的每次调用中如下:

 call 1: RSTRules.add(RSTRule)=R1
 call 2: RSTRules.add(RSTRule)=R2,R2
 call 3: RSTRules.add(RSTRule)=R3,R3,R3
 call 4: RSTRules.add(RSTRule)=R4,R4,R4

这意味着每次添加新元素时,它都会从数组列表中删除前面的元素,但会重复新元素。

这是我的代码:

public class TextPlan extends ArrayList<Object>  {

  RSTRules rstRules=new RSTRules();

  public RSTRules produceAllRSTRules(RSTRules rstRules) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    RSTRule rstRule=new RSTRule();
        Method[] methods =rstRule.getClass().getMethods();
        for (Method method : methods) {
             if (method.getName().startsWith("generate")) {
            rstRule=(RSTRule)method.invoke(rstRule);
            rstRules.add(rstRule) ;
               }
         }
          return rstRules;
   }
}

我在“RSTRule”中的一个方法,我在“TextPlan”中调用所有这些方法来生成所有规则的实例;

public class RSTRule{
    protected String ruleName;
    protected DiscourseRelation discourseRelation;
    protected String ruleNucleus;
    protected String ruleSatellite;
    protected String condition;
    int heuristic;


    public RSTRule generateBothAppearBothCosts_Join(){
            this.discourseRelation=DiscourseRelation.Join;
            this.ruleNucleus="BothProductAppear_Elaboration";
            this.ruleSatellite="BothProductCost_Elaboration";
            this.ruleName="BothProductAppearAndBothProductCost_Join";
            this.condition=null;
            this.heuristic=9;
            return this;
        }
}

1 个答案:

答案 0 :(得分:5)

您没有向列表中添加四个新的RSTRule实例,您将添加相同的RSTRule实例四次并每次修改它。由于存储了四次相同的实例,因此修改会显示在列表的每个位置。