Java - 避免通过引用传递

时间:2015-07-01 06:05:10

标签: java parameters reference

我在Java中创建了一个Line类,我还有一个绘图类,其中有一个方法将该Line绘制到屏幕上;当我调用该方法时,它也会使Line居中,一旦方法完成,它就会编辑原始Line的值。

我想到的一个非理想的解决方案是将Line去中心以改变它的价值,但是我有更多的东西,而不仅仅是这个项目中的Line和绘图类,我想知道一个方法来避免这个问题。在C ++中,我知道您可以通过地址或指针发送参数,据我所知,您不能在Java中执行此操作,但如果有类似的内容,则可能是最好的解决方案。

这是在屏幕上绘制Line的方法的代码。

public void drawLine(Line ln) {
    //I have used a new variable to try to avoid the problem, but it doesn't work.
    Line buf = new Line();
    buf.begin = ln.begin;
    buf.end = ln.end;

    buf.begin = centerPoint(buf.begin);
    buf.end = centerPoint(buf.end);
    gfx.drawLine((int) buf.begin.x, (int) buf.begin.y, (int) buf.end.x, (int) buf.end.y);
}

以下是我使用Line的方式

    Line ln = new Line(0, 0, 100, 0);
    draw.drawLine(ln);
    System.out.println(ln.begin.x + ", " + ln.end.x);
    //It should print 0, 0, but instead it prints out a different number, because it has been centered.

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您的问题似乎是ln.beginln.end实例的状态已被centerPoint方法更改。

如果buf.beginbuf.end是这些实例的副本而不是引用它们,则可以避免这种情况。

public void drawLine(Line ln) {
    Line buf = new Line();
    buf.begin = new Point(ln.begin); // I'm guessing the class name and available constructor
    buf.end = new Point(ln.end); // I'm guessing the class name and available constructor

    buf.begin = centerPoint(buf.begin);
    buf.end = centerPoint(buf.end);
    gfx.drawLine((int) buf.begin.x, (int) buf.begin.y, (int) buf.end.x, (int) buf.end.y);
}