按值克隆 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();
我无法回答第二个问题,因为你没有解释该方法的作用。
我想复制我实现的 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();
我无法回答第二个问题,因为你没有解释该方法的作用。