1

私はこれを持っています:

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()が必要なため、これは明らかにコンパイル エラーです。Circlevoid

このような些細な目的でローカル変数を宣言する必要がないようにするにはどうすればよいですか?

4

4 に答える 4

6

ローカル変数を持たない理由はありません。を呼び出すとnew、どちらの方法でも新しいオブジェクトが作成されます。ローカル変数を使用しないソリューションは、より面倒で読みにくくなります。

変数は、「円」が割り当てられているメモリへの単なるポインタです。したがって、ログ関数に引数を渡すときは、そのポインターを渡し、ログ内で、作成されたサークル インスタンスを操作します。ディープコピーはありません。

于 2013-10-02T14:27:07.517 に答える
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 に答える