【问题标题】:The way to clone object in java by value - not by reference在java中通过值克隆对象的方法——而不是通过引用
【发布时间】:2019-08-19 11:36:43
【问题描述】:

我想复制我实现的类对象,而不是按值的引用顺序。

我的代码有时表现得很奇怪。

这是我的类元素

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

【问题讨论】:

    标签: java clone pass-by-reference


    【解决方案1】:

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

    构造函数

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

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

    【讨论】:

    • 嗨,我正在更改 element2 的内部值并尝试将数据返回给 element1 并且有垃圾。你知道为什么吗?
    • 要更改元素的值,请使用 element.setX(2);但是,如果您的代码类似于 Element element1=firstPoint;如果你改变 firstPoint,element1 也会改变,反之亦然。因此,有一种情况是您以错误的方式处理变量并更改了您不想要的值
    【解决方案2】:

    你会为你的类和一些构造函数添加一个复制方法。

        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;
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 你能看看为什么最后四个分配元素输出垃圾吗?我的 if 语句下面的行
      • 很抱歉,我不知道 mainActivity.ELEMENT 是什么,所以我无法评论您的情况(但我认为问题源于这里)。
      猜你喜欢
      • 2015-02-04
      • 2011-04-19
      • 2014-06-11
      • 2012-06-19
      • 1970-01-01
      • 2020-07-28
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多