1

I have this:

public void log(Circle circOrig) {
    ...
}

And I'm trying to avoid doing this:

private void addPositions(PositionsLogger positionsLogger) {
    ...
    Circle circ = new Circle(0,0,0); //`circ` could be final
    circ.setPosition(0,0);
    posLogger.log(circ);
    ...
}

By doing this:

public static void main(String[] args) {
    ...
    posLogger.log(new (Circle(0, 0, 0).setPosition(0, 0)));
    ...
}

Which is obviously a compile error because log() requires a Circle, not a void.

How can I avoid having to declare a local variable for such a trivial purpose?

4

4 回答 4

6

没有理由不使用局部变量。当您调用时new,它会以任何一种方式创建新对象。没有局部变量的解决方案更混乱,可读性更差。

变量只是指向内存的指针,其中分配了“圆”。因此,当将参数传递给您的日志函数时,您会传递该指针并在日志内部,您正在使用创建的圆实例。没有深拷贝。

于 2013-10-02T14:27:07.517 回答
1

假设您无权访问 Circle 代码并且不喜欢覆盖机制(看起来像拥有局部变量一样丑陋,所以有点毫无意义),那么您所能做的就是定义一个创建圆圈的辅助方法,设置它的位置并返回圆。

我可以理解您为什么要这样做,但我认为 Java 就是这样,如果不访问 Circle 代码,您将无法获得出色的解决方案。

于 2013-10-02T14:44:13.760 回答
1

如果你真的不想有一个局部变量,你可以像这样覆盖 circle 类:

posLogger.log(new (Circle(0, 0, 0){{setPosition(0, 0);}}));
于 2013-10-02T14:27:59.033 回答
0

作为替代解决方案,您应该考虑扩展Circle添加一个新的构造函数来满足您的需要。

如果可以修改它,您可以在类的代码中执行此操作,也可以在新类中执行此操作。

public class ExtendedCircle extends Circle{
    public class ExtendedCircle(int x, int y, int x, int positionX, int positionY){
            super(x,y,z);
            setPosition(positionX, positionY);
    }
}

请注意,我不认为创建一个新类是一个理想的解决方案。最好有一个辅助方法或保留对其他答案中报告的变量的引用。

于 2013-10-02T14:50:10.517 回答