0

我的积分等级是不可变的。当我最初输入构造函数时,它应该被复制到 cloneList 对象中。如果通过构造函数更改数组中的几个索引,这将允许它保持以前的方式。我已经尝试了几乎所有可能的组合,但仍然遇到了麻烦。我希望 cloneList 是原始 Point[] points 数组的副本,因此如果 points 数组发生更改,则 cloneList 不会。

import java.util.Arrays;
import java.util.Iterator;
 import java.util.List;

public class  Polygon {

private double xSum = 0;
private double ySum = 0;
private Point[] points;
private Point[] cloneList;
private Point a;

public Polygon(Point[] points) {

    this.points = points;
    cloneList = new Point[points.length];
    for (int i = 0; i < cloneList.length; i++) {
        cloneList[i] = points[i];
    }



    for (int i = 0; i < cloneList.length; i++)
        System.out.println(cloneList[i]);


     for (int i = 0; i < points.length; i++){
    cloneList[i] = points[i];

    // System.out.print(cloneList[i].getX());
    // System.out.print(cloneList[i].getY());
    // System.out.println();
}

public Point getVertexAverage() {
    double xSum = 0;
    double ySum = 0;
    for (int index = 0; index < cloneList.length; index++) {
        xSum = xSum + cloneList[index].getX();
        ySum = ySum + cloneList[index].getY();
    }

    return new Point(xSum / getNumSides(), ySum / getNumSides());
}

public int getNumberSides() {
    return cloneList.length;
}

}

4

3 回答 3

1

您必须编写一个复制方法来将每个变量从一个对象复制到一个新对象中,并使用该新对象。除了复制之外,没有办法在 Java 中取消引用引用(即按值传递)。

就像是:

public Point copy(){
 Point temp = new Point();
 temp.setX(this.getX());
 ....Add in the rest of the assignments.
 return temp;
}
于 2013-04-23T04:19:38.373 回答
1

根据我对您帖子的评论,解决您的问题的一个选项是向您的数组添加 Point实例:cloneList

public PolygonImpl(Point[] points) {
    //some code here...
    for (int i = 0; i < cloneList.length; i++) {
        //create the new Point instance (the clone) here
        //this code is just an example since you haven't provided the Point constructor
        cloneList[i] = new Point(points[i].getX(), points[i].getY());
    }
    //some more code here...
}

但是这个选项有点笨拙,因为当向接口(或类)cloneList的客户端提供属性时,它会修改数组(因为数组是可变的)并且原始的也会被修改。知道这一点,最好不要有as属性,而是在方法上创建这个列表:PolygonPolygonImplcloneListcloneList

public Point[] getPoints() {
    Point[] cloneList = new PointList[X]; //where X is some size you know
    for (int i = 0; i < cloneList.length; i++) {
        //create the new Point instance (the clone) here
        //this code is just an example since you haven't provided the Point constructor
        cloneList[i] = new Point(points[i].getX(), points[i].getY());
    }
    return cloneList;
}

我提倡这个选项,因为你的Point班级似乎没有多少数据。对于您的类将更复杂的现实世界应用程序(例如具有List包含更多对象实例的对象内部构成复杂树),您不应该创建这样的东西(因为它将是一个活生生的地狱),而是使用副本/克隆方法。为此,您可以使用此处提供的一些技术:Java:深度克隆/复制实例的推荐解决方案

于 2013-04-23T04:23:39.607 回答
0

您没有Point在代码中制作任何实际 s 的副本。请记住,Java 中的大多数值都是引用,因此虽然看起来您正在复制 . Point,但您只是在复制指针。

您可以做几件事。您可以使用不同的方法来克隆您的对象(例如,请参阅深拷贝、浅拷贝、克隆)。另一种方法是将您Point的 s 定义为不可变的(很像String类):

public class Point {
    private final float x;
    private final float y;

    public Point(float x, float y) {
        this.x = x;
        this.y = y;
    }

    public float getX() {
        return this.x;
    }

    public float getY() {
        return this.y;
    }
}

这将强制所有客户端代码将点视为不可变的。然后,您可以将点上的操作定义为返回新点。

于 2013-04-23T04:25:30.037 回答