1

完全に良いメソッドとは何かを入力するときにどう考えればよいか知りたいのですが、メソッドとして認識されません。ここにあります。

private GObject getCollidingObject() {
    gobj = getElementAt(ball.getX(),ball.getY());
    if (gobj != null) {
        return gobj;
    }
    gobj = getElementAt(ball.getX()+BALL_RADIUS,ball.getY());
    if (gobj != null) {
        return gobj;
    }
    gobj = getElementAt(ball.getX(),ball.getY()+BALL_RADIUS);
    if (gobj != null) {
        return gobj;
    }
    gobj = getElementAt(ball.getX()+BALL_RADIUS,ball.getY()+BALL_RADIUS);
    if (gobj != null) {
        return gobj;
    }
}

現在、Eclipse は「このメソッドは GObject 型の結果を返さなければならない」と言っており、GObject を紫色で強調表示していません。これは、作業に満足していることを伝える通常の方法です。

私は何を考えるべきですか?私はすべての開閉括弧を注意深く調べましたが、他のすべてのメソッドが機能しているので、このメソッドを間違ったスコープ内に配置したとは思いません...

他のすべてのインスタンス変数を含むプログラムの最後に、

private GObject gobj;

しかし、それは私を助けていないようです。

ご指摘ありがとうございます。

4

2 に答える 2

2

あなたの機能にはいくつか問題があります。gobjまず、メソッド本体内で宣言しません。あなたはreturnクラスのデータメンバーにしようとしていると私に思わせる他の場所でコメントをしました。控えめに言っても、それは奇妙なデザインです。(通常、各メソッドをできるだけ独立させることが目標です。このようにデータを共有している場合、後で見つけるのが困難なバグが発生するリスクがあります。)

あなたの関数は常にデータを返すとは限りません.明示的なreturnステートメントなしで関数の最後から落ちることがあります. これら 4 つの条件のいずれかが常に true になることはわかっているかもしれませんが、コンパイラはそうではありません。正直なところ、将来その条件を破ることは避けられないため、それは正しいでしょう。

このコードは、より美しくする方法で記述するのは困難です。(まあ、Java の||演算子nullも同様に機能する場合、これは非常に美しい短い関数になる可能性があります。しかし、Javaはand で||しか機能しません。)truefalse

おそらく、関数を書き直す最も簡単な方法は、最後の試行の後にガードを削除することです。

private GObject getCollidingObject() {
    GObject gobj;

    gobj = getElementAt(ball.getX(),ball.getY());
    if (gobj != null) {
        return gobj;
    }
    gobj = getElementAt(ball.getX()+BALL_RADIUS,ball.getY());
    if (gobj != null) {
        return gobj;
    }
    gobj = getElementAt(ball.getX(),ball.getY()+BALL_RADIUS);
    if (gobj != null) {
        return gobj;
    }
    gobj = getElementAt(ball.getX()+BALL_RADIUS,ball.getY()+BALL_RADIUS);

    return gobj;
}

returnこのようにして、関数を介してどのパスをたどっても、少なくとも 1 つを実行します。

于 2012-07-24T03:43:24.630 に答える
1

gobjコンパイラは、あなたがとして宣言されていないことを訴えていますGObject。それが実際にインスタンスであるかどうかは関係ありません。戻り型(またはそのサブクラス/実装されたクラスまたはインターフェースの1つ)であると宣言するか、そのように正常にキャストする必要があります。

何としてgobj宣言されていますか?

編集:そしてもちろん、すべての場合にreturnステートメントがあることを確認する必要があります。ifすべてのステートメントがに評価された場合にヒットするデフォルトはありませんfalse

于 2012-07-24T03:16:36.883 に答える