我有这个:
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
。
如何避免因为这么微不足道的目的而声明局部变量?
答案 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);
}
}
请注意,我不认为创建新类是理想的解决方案。最好有一个辅助方法或保持对其他答案中报告的变量的引用。