按值克隆 java 中的对象的方法 - 而不是按引用

The way to clone object in java by value - not by reference

我想复制我实现的 class 对象,而不是按值作为参考顺序。

我的代码有时会以奇怪的方式运行。

这是我的 class 元素

public class Element {
    int x;
    int y;
    public Element(){

    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }
}

我正在使用的示例代码:

public void fourthTurnElement6(){
    MainLoopClass.helpTurn=false;
    Element element1=firstPoint;
    Element element2=secoundPoint;
    Element element3=thirdPoint;
    Element element4=fourthPoint;
    element1.setX(firstPoint.getX());
    element1.setY(firstPoint.getY()+1);
    element2.setX(firstPoint.getX()+1);
    element2.setY(firstPoint.getY());
    element3.setX(firstPoint.getX()+1);
    element3.setY(firstPoint.getY()-1);
    element4.setX(thirdPoint.getX()+1);
    element4.setY(thirdPoint.getY());


    if(HelperMethods.detectTurnColision(element1,element2,
        element3,element4)){
            return;
    }

    if(HelperMethods.detectTurnRightWallColision(element1,
        element2,element3,element4)){
            return;
    }
    firstPoint=element1;
    secoundPoint=element2;
    thirdPoint=element3;
    fourthPoint=element4;

有没有可能时好时坏?在我的代码中似乎 detectTurnColision 工作正常,但问题是 detectTurnRightWallColision。第二个函数很简单,但我不认为错误发生在那里。

编辑: 你在这里看到任何错误吗:

    Element element1=firstPoint.clone();
    Element element2=secoundPoint.clone();
    Element element3=thirdPoint.clone();
    Element element4=fourthPoint.clone();


    element1.setX(firstPoint.getX());
    element1.setY((firstPoint.getY()));
    element2.setX(firstPoint.getX());
    element2.setY(firstPoint.getY()+1);
    element3.setX(firstPoint.getX());
    element3.setY(firstPoint.getY()+2);
    element4.setX(firstPoint.getX()-1);
    element4.setY(firstPoint.getY()+2);
    if((MainActivity.ELEMENTS-1-firstPoint.getY()<2) )
        return;
    if(HelperMethods.detectTurnColision(element1,element2,
        element3,element4)){
            return;
    }  
    if(HelperMethods.detectTurnRightWallColision(element1,
        element2,element3,element4)){
            return;
    }
    firstPoint.setX(element1.getX());
    firstPoint.setY(element1.getY());
    secoundPoint.setX(element2.getX());
    secoundPoint.setY(element2.getY());
    thirdPoint.setX(element3.getX());
    thirdPoint.setY(element3.getY());
    fourthPoint.setX(element4.getX());
    fourthPoint.setY(element4.getY());

您将向 class 和一些构造函数添加一个复制方法。

    public class Element {
        int x;
        int y;

        public Element(){

        }

        public Element(int x, int y) {

        }

        public Element copy() {
            return new Element(x, y);
        }

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }

        public void setX(int x) {
            this.x = x;
        }

        public void setY(int y) {
            this.y = y;
        }
    }
        Element element = new Element(0, 0);

        Element secondElement = element.copy();

        assert element != secondElement;

在你的代码中,element1 和 firstPoint 是同一个对象,这是你想要的吗?

另外,当你设置element2和element3为firstPoint时,之前已经修改过了。这可能是一种不需要的副作用。

element1,2,3,4 必须是独立对象 :

Element element1 = new Element()
Element element2 = new Element()
Element element3 = new Element()
Element element4 = new Element()

但是,Jason 的解决方案更好,因为这就是 Java 的处理方式。

关于 'copy' 部分,您可以在 Element Class.

中创建复制构造函数或方法

构造函数 :

public Element(Element element){
    this.x = element.x
    this.y = element.y
}
// ToDo handle null argument if needed if(element==null)return; 
// values will be set to 0.

示例

Element element1 = new Element();
Element element2 = new Element(element1);

方法:

public Element clone(){
    Element newCloneElement = new Element();
    newCloneElement.x = x;
    newCloneElement.y = y;
    return newCloneElement;
}
// The above method can implemented as static with an Element argument
// and the values will be copied from the argument.

示例

Element element1 = new Element();
Element element2 = element1.clone();

我无法回答第二个问题,因为你没有解释该方法的作用。