Создание ссылки на Java - PullRequest
1 голос
/ 05 октября 2009

Я хочу использовать ссылку в качестве сокращения для элемента массива, где массив состоит из элементов базового типа (целых чисел). Как я могу явно создать ссылку на Java? Возможно ли это?

/* ... */
//neighbors = new int[][]
//I'm using neighbor, below, to refer to an element in neighbors so that the code
//is easier to read. I want it to be a reference so that I can write to it.
int neighbor = neighbors[y][x]; 

if (neighbor == 0)
    btn.setText("");
else
    btn.setText("" + neighbor);

if (btn.isEnabled() == true) {
    numSquaresRevealed++;
    btn.setEnabled(false);
}

//I want neighbor to be a reference so that I can be consistent and use it below
if (changeNeighbors)
    neighbors[y][x] = -1;
/* ... */

Ответы [ 4 ]

4 голосов
/ 05 октября 2009

Что вы могли бы сделать, это изменить свою логику, чтобы передать соседям [x] [y] и записать новое значение того, что вы передали.

neighbors[x][y] = setButton(neighbors[x][y]);
private int setButton(int neighbor) {
  btn.setText((neighbor == 0 ? "" : "" + neighbor));

  if (btn.isEnabled() == true) {
        numSquaresRevealed++;
        btn.setEnabled(false);
  }

  //I want neighbor to be a reference so that I can be consistent and use it below
  return (changeNeighbors ? -1 : neighbor);
}

Это не использует ссылку, но может делать то, что вы хотите, что делает приложение более читабельным.

3 голосов
/ 05 октября 2009

Язык Java и стандартные библиотеки вам не помогут. Вместо этого, я думаю, вам нужно реализовать это вручную. Один из подходов заключается в создании и использовании изменяемого класса-держателя; например,

public class IntHolder {
    private int value;
    public IntHolder(int value) { this.value = value; }
    public int getValue() { return this.value; }
    public void setValue(int value) { this.value = value; }
}

и затем замените ваши int[][] декларации и т. Д. На IntHolder[][].

Другой альтернативой может быть создание собственных классов ссылок на массивы; например, * +1008 *

public class IntArray2DElement {
    private int[][] array;
    private int x;
    private int y;
    public IntArray2DElement( int[][] array, int x, int y) { 
        this.array = array; this.x = x; this.y = y; }
    public int getValue() { return this.array[x][y]; }
    public void setValue(int value) { this.array[x][y] = value; }
}

Однако, возможно, это будет более простая программа для решения этой проблемы; например запоминая значения x и y явно. Или сделайте, как подсказывает @James.

1 голос
/ 06 октября 2009

В отличие от C ++, Java поддерживает только ссылки на объекты, но не на элементы объектов и не на элементы массивов.

(Возможно, потому что это упрощает сбор мусора.)

Следовательно, вы можете сделать соседний объект полным или использовать массив с индексами в качестве «ссылки».

1 голос
/ 05 октября 2009

из вашего вопроса не ясно, является ли тип вашего массива

Integer[][] neighbors;

или

int[][] neighbors;

причина в том, что из-за автоматической распаковки Java это прекрасно компилируется:

int n = neighbors[x][y];

и на самом деле фактически

int n = neighbors[x][y].intValue();

в любом случае вы можете иметь только ссылку на не примитивный тип, поэтому, если ваш массив имеет тип Integer, вы можете просто сделать:

Integer n = neighbors[x][y];

если тип вашего массива int [] [], ваша 'ссылка' должна будет содержать ссылку на сам массив и два индекса в нем.

однако, поскольку Integer является неизменяемым, вы не можете писать в него, даже если у вас была ссылка на него, поэтому ваш единственный реальный вариант - сохранить ссылку на массив и два индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...