2011-12-29 76 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); 

即任何特殊的廣場需要鏡像其他四個角落。

我希望所有這些包括在一個單一的方法。如果有辦法在方法中使用方法,我可以只有:

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

但是,到目前爲止,我還沒有找到這樣做的方法。

乾杯。

+0

如果你提供了一些你正在嘗試做的事情的僞代碼,你可能會得到更好的幫助。任何可以由本地函數完成的事情都可以通過匿名類來完成,儘管它不會像其他語言那樣漂亮。現在我不清楚爲什麼你需要一個本地方法或將要做什麼。 – 2011-12-29 23:47:49

+0

不知道是什麼問題。難道你不能寫一個setter方法(比如你的「GameBoard」類中的'setCorners'),它需要一個座標對和參數並設置所有的角點。你真的想要實現什麼樣的變化? – Dunes 2011-12-29 23:57:33

回答

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 2011-12-30 00:56:07

+0

儘管這會起作用,但它不是很符合OOP。該方法是什麼類? – user949300 2011-12-30 00:57:41

+0

我最初是將方法放在Square中,儘管有一個板子可能有意義。相反,這是做。 – Liang 2011-12-30 01:02:37

0

不,我們不能在Java中,這是煩人有時。

您可以在Kevin外面聲明該方法。它沒有那麼壞。

本地班也很好。該方法不一定是靜態的。

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

嗨Ray 是的,這基本上是我想要的,除非我不想在兩個嵌套for循環之間有大塊代碼,每次我想在不同的位置初始化不同類型的正方形時。 – Liang 2011-12-30 00:58:47

+0

你將需要這8條語句。讓我把它變成一個函數。請參閱編輯。你需要某個地方的邏輯。 – 2011-12-30 01:27:33

1

在我看來,你需要一個新的類,GameBoard,其中包含GameSquares的數組。這將有一個方法

setSquare(INT A,INT B,GameSquare GS)

其知道的鏡像。

+0

是的,你做得很好。我只是想知道這是否可行,而這正是讓我思考如果java有這種機制的問題。 – Liang 2011-12-30 01:03:56