避免声明局部变量

时间:2013-10-02 14:24:05

标签: java

我有这个:

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

我试图避免这样做:

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

通过这样做:

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

这显然是编译错误,因为log()需要Circle,而不是void

如何避免因为这么微不足道的目的而声明局部变量?

4 个答案:

答案 0 :(得分:5)

没有理由不拥有局部变量。当你致电new时,它会以任何方式创建新对象。没有局部变量的解决方案更麻烦,更不易读。

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

答案 1 :(得分:1)

如果您真的不想拥有局部变量,可以像这样覆盖圆圈类:

posLogger.log(new (Circle(0, 0, 0){{setPosition(0, 0);}}));

答案 2 :(得分:1)

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

我可以理解你为什么要这样做但我认为Java就是这样,如果没有访问Circle代码,你就不会得到一个出色的解决方案。

答案 3 :(得分: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);
    }
}

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