0

set1sub(sub.local)メソッドを使用して、グローバル配列を格納する(クラス内の配列を別のオブジェクトから認識できるようにする)ことを期待してクラスを拡張しました

public class BattleShipsClient extends ShipLocations implements Runnable, BattleShipConstants
{

BattleShipsClient()
{ 
}

public void placeBoard(int player) throws IOException// this is only called once and not updated when clicked again 
{
    while(getLocations())

    {
        while(isWaiting())//true
        {
            toServer.writeInt(player);
    int row = getRowSelected();
    int col = getColumnSelected();
    int choice=Integer.parseInt(JOptionPane.showInputDialog("Please 1 for a sub, 2 for a battleship and 3 for a destroyer"));
    clickCount ++;

    if(clickCount >2)
    {
        setLocation(false);
        continueToPlay=true;
    }

    if (choice ==1 &&sub.placed==false)
    {
        String orientation =JOptionPane.showInputDialog("please enter your orientations");


        if(orientation.equalsIgnoreCase("h"))
        {


            //row os the same
            //column number will be sent, then plus one on the other side
            sub.local = new int[2][2];
            sub.local[0][0] =row;
            sub.local[0][1]=col;
            sub.local[1][0]=row;
            sub.local[1][1] =col+1;

            toServer.writeInt(row);
            toServer.writeInt(col);


            toServer.writeChar('s');


            sub.placed=true;
            setp1sub(sub.local);
                          /*setp1sub(new int[][]{{row,col},
                    {row,col+1}});*/


            grid[row][col+1].setToken(getMyToken());

        }

次に、ship Locationsクラスがありますが、ship locationクラスの新しいオブジェクトを作成してこの配列を読み取ろうとすると、常に[[0、0]、[0、0]]に設定され、静的にしようとしました。アトミック

public class ShipLocations {


int [][] p1sub;

public ShipLocations()
{
    p1sub = new int[2][2];
}
public int[][] getp1sub()
{
    return p1sub;
}
public void setp1sub(int[][] local) {
    for (int i = 0;i <local.length;i++)
    {
        for(int j = 0;j<local.length;j++)
        {
            p1sub [i][j]= local[i][j];
        }
    }

}



}
4

1 に答える 1

1

ShipLocations(またはサブクラス)の新しいインスタンスを作成するたびに、コンストラクターが呼び出されます。この場合、コンストラクターはp1sub配列を再初期化します。

あなたのデザインでは、継承を使いすぎています。メソッドと変数を使用するためだけにクラスから継承するべきではありません。

グローバル変数をクラスに格納するには:

public class ShipLocations {
 static int [][] p1sub;
 static{
  p1sub = new int[2][2];
 }
 public static void setp1sub(...){...}
 public static int[][] getp1sub(){...}
}

次に、インスタンスを作成する代わりに、クラス名で使用します。

int [][] x = ShipLocations.getp1sub();

グローバル変数の使用は可能な限り避けるべきですが。これは悪い設計と見なされ、コードを再利用するときに問題になる可能性があります。これを行う正しい方法は、ShipLocationsオブジェクトをBattleShipsClientのローカル変数として設定し、新しいインスタンスを初期化するときに設定することです。次に、最初に共通のShipLocationオブジェクトを作成し、同じ配列を表示する必要があるすべてのクライアントに渡します。

于 2013-01-15T13:11:47.403 に答える