填充自定义对象的数组会将其他对象的字段修改为数组

时间:2014-03-19 18:23:52

标签: java arrays populate

我创建了一个名为MipMapData的类来保存有关mipmap的信息,它保留了维度,数据大小和imageformat。 从代码的另一部分我创建了一个MipMapData对象的数组,问题是每次我将一个新的MipMapData对象添加到数组中所有mimpamp信息对象进入数组都会修改它们的维度字段,当我填充所有数组结果是所有对象的维度字段中的值与添加到数组中的最后一个值相同。 我在维度领域做错了什么?

    import java.awt.Dimension;
import com.jme3.texture.Image;
import com.jme3.texture.Image.Format;


public class MipMapData {
    private Dimension dimension;
    private Long dataSize;
    private Image.Format format;

//Constructor calculates size. Has this arguments to avoid the existence of mipmap incomplete data or with errors in datasize
public MipMapData(Image.Format format, Dimension dimension){
    this.format=format;
    setDimension(dimension);
}



public Dimension getDimension() {
    return dimension;
}
public void setDimension(Dimension dimension) {
    this.dimension = dimension;


    if(format==Format.DXT5||format==Format.DXT3){
        this.dataSize=(long) (dimension.height*dimension.width);
        if(this.dataSize<16)
            this.dataSize=(long) 16;
        return;
    }
    else if(format==Format.DXT1){
        this.dataSize=(long)((dimension.height*dimension.width)/2);
        if(this.dataSize<8)
            this.dataSize=(long) 8;
        return;
    }
    else if(format==Format.ABGR8){
        this.dataSize=(long)(dimension.height*dimension.width*4);
        return;
    }
    else if(format==Format.Luminance8||format==Format.Depth){
        this.dataSize=(long)(dimension.height*dimension.width);
        return;
    }
}




public Long getDataSize() {
    return dataSize;
}


//The datasize of each mipmap is automatically calculated in the constructor
static MipMapData[] createMipMapDataArray(Dimension textureDimensions, int numberOfMipMaps, Image.Format imageFormat){
    int width=textureDimensions.width;
    int height=textureDimensions.height;
    Dimension mipMapDimension= new Dimension();
    MipMapData[] mipMapDataArray= new MipMapData[11];

    if(imageFormat==Format.DXT5|| imageFormat==Format.DXT3){
        for(int i=0;i<=10;i++){
            if((width)<1)
                width=1;
            if((height)<1)
                height=1;
            mipMapDimension.height=height;
            mipMapDimension.width=width;
            mipMapDataArray[i]= new MipMapData(imageFormat,mipMapDimension);
            //actualize dimensions for next mipmap
            width/=2;
            height/=2;
        }
    }
    else if(imageFormat==Format.DXT1){
        for(int i=0;i<=10;i++){
            if((width)<1)
                width=1;
            if((height)<1)
                height=1;
            mipMapDimension.height=height;
            mipMapDimension.width=width;
            mipMapDataArray[i]= new MipMapData(imageFormat,mipMapDimension);
            //actualize dimensions for next mipmap
            width/=2;
            height/=2;

        }
    }
    else if(imageFormat==Format.ABGR8||imageFormat==Format.Luminance8||imageFormat==Format.Depth){
        for(int i=0; i<=10;i++){
            if((width)<1)
                width=1;
            if((height)<1)
                height=1;
            mipMapDimension.height=height;
            mipMapDimension.width=width;
            mipMapDataArray[i]= new MipMapData(imageFormat,mipMapDimension);
            //actualize dimensions for next mipmap
            width/=2;
            height/=2;

        }
    }
    return mipMapDataArray;
}

}

2 个答案:

答案 0 :(得分:1)

当您致电createMinMapDataArray()时,所有字段设置为相同的原因是因为您检查某些条件,例如

if(imageFormat==Format.DXT5|| imageFormat==Format.DXT3)

然后遍历数组并使用对每个索引相同的新MinMap()对象初始化索引。

向数组添加的概念并不是考虑数组的正确方法。数组用于存储通常具有预定大小的信息。要将对象添加到第i个索引,您可以执行以下操作:

MipMapData[] minMaps = createMipMapDataArray(// pass your parameters here)
minMaps[10] = new MinMap(// pass your parameters)

当然,这不会值添加到数组中。它使用新值覆盖/替换minMaps [10]的值。

要向列表中添加未确定数量的MinMaps,请考虑使用ArrayList<MinMap>

ArrayList<MinMap> minMapList = new ArrayList<MinMap>();
minMapList.add(new MinMap(// pass your parameters here));

答案 1 :(得分:0)

您正在循环外创建一个分配给所有MipMapData对象的Dimension对象。

Dimension mipMapDimension= new Dimension();

请记住,Java对象是通过引用传递的。因此,当您将mipMapDimension传递给MipMapData构造函数时,它将在所有构造函数中被引用。