做了一个函数返回一个ArrayList的值,用其他调用,但每次返回的都是在上次调用的基础上继续往这个值上累加,比如说第一次返回[1,2],第二次应该返回[3,4],可第二次返回的却是[1,2,3,4],有什么方法可以解决?谢谢!

解决方案 »

  1.   

    你应该是第一次调用后没有清空arraylist,用arraylist.clear() 清空
      

  2.   

    import java.util.*;
    interface TupleInterface {
    ArrayList attName=new ArrayList();
    ArrayList attValue=new ArrayList();
    }
    public class Tuple implements TupleInterface{
    }这是我自己定义的一个tuple类,然后一个scan的函数:
    while(resultSet.next()){
    ArrayList temp=new ArrayList();
    tupleNo++;
             for(int p=1;p<=nColumns;p++){
              
              String val=resultSet.getString(p);
              Object obj=(Object)val;
              temp.add(obj);
             }
             tuple.attValue.add(temp);
             } return tuple;
    }发现每次调用scan时,都会累加在之前的结果上。还有,刚发现不管在哪个函数里,只要新建一个tuple对象,就会默认给这个新建的对象赋值为当前另外一个tuple对象的值!这是怎么回事?是不是tuple类的定义有错误?谢谢!
      

  3.   

    不是你类的定义有错误,是你的接口有错误。接口里面定义的任何对象实例都会被认为是static final的,即使你没有显式的注明static final。这就是为什么你在TupleInterface里面要写
    ArrayList attName=new ArrayList();
    而不能写
    ArrayList attName;static属性会在所有实现了TupleInterface的对象之间共用。所以新建一个对象也会接受老对象的属性。在while之前调用
    attName.clear();
    attValue.clear();
    应该可以解决结果累加的问题。
      

  4.   

    嗯,这次是没有累加,可前一个tuple对象的值没有了。有没有办法还能保持前一个值呢??谢谢!
      

  5.   

    你的目的就是要每个实例都有自己专有属性。很简单,把attValue和attName属性移到Tuple里就可以了。特别提醒一下:在JAVA里面,抽象的往往是行为而不是属性。比如
    interface TupleInterface {
        public List getAttName();
        public List getAttValue();
    }
      

  6.   

    哦!你是说把attName和attValue放到Tuple class里,然后建两个赋值函数给tuple对象赋值,是吗?好,我试试,但这样怎么把attName和attValue这两个属性的值赋给tuple对象呢?就是说,调用tuple对象t1的时候,怎么访问它的这两个属性,使用它的值呢?谢谢!
      

  7.   

    interface TupleInterface {
        public List getAttName();
        public List getAttValue();
    }public class Tuple implements TupleInterface {
        private List attName;
        private List attValue;    public Tuple() {    }}
      

  8.   

    晕……前面按错键了public class Tuple implements TupleInterface {
        private List attName;
        private List attValue;    public Tuple() {
            this.attName = new ArrayList();
            this.attValue = new ArrayList();
        }    public List getAttName() {
            return this.attName;
        }    public List getAttValue() {
            return this.attValue;
        }    ...}调用的时候:
    TupleInterface tuple = new Tuple();
    tuple.getAttName();
    tuple.getAttValue();
      

  9.   

    不过引用的时候好像应该是
    Tuple tuple=new Tuple();
    TupleInterface说是invisible的
      

  10.   

    对的。还有一个建议就是你把TupleInterface独立写到另一个叫TupleInterface.java的文件中,并申明为public