2011-12-29 15 views
2

基本的に問題は、Javaメソッドで非常にわずかなバリエーションで再利用する必要のあるコードセグメントがあることです。Java - クラスメソッド内でメソッド/関数/サブルーチンを定義する

このセクションでは、クラスメソッド内でのみ定義された変数へのアクセスも必要です。

私は検索しましたが、メソッド内にサブルーチンを追加することはできません。私はローカルクラスを追加することを考えましたが、これらのクラスで静的メソッドを使用することはできないようです。これは本当に必要なものです。

それがすべてで助けている場合、私の目標は、基本的には、から構成されていること、ゲームボードを初期化することです。

GameSquare[][] board = new GameSquare[15][15]; 

と各呼び出しのために:

board[a][b] = new GameSquare(params); 

のために対応するコールがあるはずです。

board[b][a] = new GameSquare(params); 
board[15-a][15-b] = new GameSquare(params); 
board[15-b][15-a] = new GameSquare(params); 

いずれかの特別な四角形は、他の4つのコーナーをまたいでミラーリングする必要があります。

私はこれらすべてを単一の方法に含めることを望んでいます。

method(int a, int b, otherparams passed to GameSquare constructor){ 
    //initialise those 4 squares. 
} 

をしかし、これまでのところ、私はこれを行うには、このような方法を発見していない:メソッド内のメソッドを持つ方法があった場合、私はちょうどかもしれません。

乾杯。

+0

あなたがしようとしていることの疑似コードを提供した場合、より良いヘルプが得られるかもしれません。ローカル関数が行うことができるものは、匿名クラスによって行われる可能性がありますが、他の言語よりもきれいではありません。今私はあなたがなぜローカルメソッドが必要か、それが何をするのかについてはっきりしていません。 –

+0

問題の内容が不明です。座標のペアとパラメータをとり、すべてのコーナーを設定するセッターメソッド( "GameBoard"クラスの 'setCorners'のような)を書くことはできません。実際にどのようなバリエーションを達成しようとしていますか? – Dunes

答えて

1

配列なので、配列をパラメータとしてメソッドに渡すのはどうでしょうか?プリミティブ(int,floatなど)を除き、Javaのパラメータは参照渡しであり、同じ配列を変更しています。

それを使用して
method(GameSquare[][] board, int a, int b, otherparams passed to GameSquare constructor){ 
    board[a][b] = new GameSquare(params) 
    board[b][a] = new GameSquare(params) 
    board[15-a][15-b] = new GameSquare(params) 
    board[15-b][15-a] = new GameSquare(params) 
} 

GameSquare[][] board = new GameSquare[15][15]; 
method(board,a,b,params); 
+0

ねえ、それはかなりハンディです!このようなことがあれば、私はおそらくもっと冗長になりますが、それはそれが得られるほど近いと思われます。 – Liang

+0

これはうまくいくが、それほどOOPではない。メソッドを持つクラスは何ですか? – user949300

+0

最初にこのメソッドをSquareに配置しましたが、ボードを持つのは理にかなっていました。それは代わりにこれを行います。 – Liang

0

ありません、我々は時々迷惑ですジャワ、中にすることはできません。

ケビンが示すように、メソッドを外部に宣言できます。それは悪いことではありません。

ローカルクラスでも問題ありません。メソッドは静的である必要はありません。

final GameSquare[][] board = ... 

class Util 
    void method(...) 
     board[][]... 

Util util = new Util(); 

util.method(...); 

これは少し冗長です。

0

これはあなたのスペシャルスクエアをどのようにしたいのですか?

class GameSquare { 
    GameSquare(int x) { 
     this.x = x; 
    } 
    public String toString() { 
     return "" + x; 
    } 
    int x; 
} 
public class Main { 
    void print() { 
     for (int i = 0; i < n; i++) { 
      for (int j = 0; j < n; j++) 
       if (board[i][j] == null) System.out.print("oops"); 
       else if (board[i][j].x < 10) System.out.print(board[i][j] + " "); 
       else 
        System.out.print(board[i][j] + " "); 
      System.out.println(); 
     } 
    } 
    void makeSpecial(int i,int j,int k) { 
     board[i][j] = new GameSquare(k); 
     board[j][i] = new GameSquare(k); 
     board[n - 1 - i][n - 1 - j] = new GameSquare(k); 
     board[n - 1 - j][n - 1 - i] = new GameSquare(k); 
     board[i][n - 1 - j] = new GameSquare(k); 
     board[n - 1 - j][i] = new GameSquare(k); 
     board[n - 1 - i][j] = new GameSquare(k); 
     board[j][n - 1 - i] = new GameSquare(k); 
    } 
    void init() { 
     int k = 0; 
     for (int i = 0; i < n; i++) 
      for (int j = 0; j < n; j++, k++) 
       board[i][j]=new GameSquare(0); 
     makeSpecial(2,3,1); 
     makeSpecial(5,6,2); 
    } 
    public static void main(String[] args) { 
     Main main = new Main(); 
     main.init(); 
     main.print(); 
    } 
    final int n = 7; 
    GameSquare[][] board = new GameSquare[n][n]; 
} 
+0

Hey Ray これは基本的に私が望むものですが、別の場所で別のタイプの正方形を初期化するたびに、2つのネストされたforループの間にその巨大なコードブロックがあることを望んでいませんでした。 – Liang

+0

これらの8つのステートメントが必要です。それを関数に変換してみましょう。編集を参照してください。あなたはどこかでこのロジックが必要です。 –

1

GameSquaresの配列を含む新しいクラスのGameBoardが必要です。これは、ミラーリングを知っている方法

setSquare(、int型のB、GameSquareのGS int型)

を持っているでしょう。

+0

あなたは良い点を作っています。私はこれが可能かどうか疑問に思っていましたが、これはJavaにそのような仕組みがあったと思っていた問題でした。 – Liang

関連する問題