为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

动漫人物 2023-06-14 16:10:56
我想复制我实现的类对象,而不是按值作为参考顺序。我的代码有时会以奇怪的方式运行。这是我的班级元素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。第二个函数非常简单,但我不认为错误发生在那里。
查看完整描述

3 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

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


    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;


查看完整回答
反对 回复 2023-06-14
?
jeck猫

TA贡献1909条经验 获得超7个赞

在您的代码中,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 的处理方式。


查看完整回答
反对 回复 2023-06-14
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

关于“复制”部分,您可以在元素类中创建复制构造函数或方法。


构造函数:


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();

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


查看完整回答
反对 回复 2023-06-14
  • 3 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信