开发者

Creating a reference in Java

开发者 https://www.devze.com 2022-12-08 04:44 出处:网络
I want to use a reference as a shorthand to an array element, where the array consists of elements of a basic type (integers). How can I explicitly 开发者_StackOverflow社区create a reference in Java?

I want to use a reference as a shorthand to an array element, where the array consists of elements of a basic type (integers). How can I explicitly 开发者_StackOverflow社区create a reference in Java? Is it possible?

/* ... */
//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;
/* ... */


What you could do is to change your logic so that you pass in neighbors[x][y] and write out the new value of what you passed in.

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);
}

This doesn't use a reference but it may do what you want, which is to make the application more readable.


The Java language and standard libraries won't help you. Instead, I think you'll need to implement it by hand. One approach is to create and use a mutable holder class; e.g.

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; }
}

and then replace your int[][] declarations, etc with IntHolder[][].

Another alternative would be to create your own array reference classes; e.g.

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; }
}

However, it would probably be simpler program around the problem; e.g. by remembering the x and y values explicitly. Or do as @James suggests.


it's not clear from your question if the type of your array is

Integer[][] neighbors;

or

int[][] neighbors;

the reason is that due to Java auto-unboxing, this compiles fine:

int n = neighbors[x][y];

and is in fact actually

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

in any case, you can only have a reference to a non primitive type, so if your array is of type Integer, you can simply do:

Integer n = neighbors[x][y];

if your array types is int[][], your 'reference' will have to contain a reference to the array itself, and two indexes into it.

however, since Integer is immutable, you can't write to it even if you had a reference to it, so your only real option is to keep a reference to the array and two indexes.


Contrary to C++, Java only support references to objects, not to members of objects, and not to elements of arrays.

(Perhaps because it simplifies Garbage Collection.)

Therefore, you can either make neighbor a full object, or live with using the array with the indexes as "reference".

0

精彩评论

暂无评论...
验证码 换一张
取 消