Указатель на целое число в Java - PullRequest
11 голосов
/ 28 февраля 2011

У меня есть такой код

int a,b;
switch(whatever){
    case 1:
      lots_of_lines_dealing_with_variable_a;
    case 2:
      same_lines_but_dealing_with_variable_b;
}

Я думал о том, чтобы сделать:

int a,b;
pointer_to_int p;
switch(whatever){
    case 1:
      p=a;
    case 2:
      p=b;
}
lots_of_lines_dealing_with_pointer_p;

Это сократит код примерно до половины строк, но Java не позволяет указатели на целые числа. Итак, есть ли способ подойти к этому?

Редактировать: домашнее задание гораздо больше, чем просто этот метод. Мне нужно создать класс с именем «DoubleList», который содержит два связанных списка в одном векторе. Целые числа, о которых я говорю, - это указатели на начало списков, которые мне нужно перемещать в другие позиции списков при добавлении или удалении элементов в списки

Ответы [ 7 ]

19 голосов
/ 28 февраля 2011

Может быть, я что-то упускаю, но выглядит легко решаемым для меня:

int a,b;

switch(whatever) {
  case 1:
    a = manipulateValue(a);
    break;
  case 2:
    b = manipulateValue(b);
    break;
}

int manipulateValue(int v) {
  // lots of lines dealing with variable v
  return v;
}

Если вам не нужно изменять переменные, вы можете пропустить возвращаемое значение (просто используйте void) и присваивание.

Если для вызова метода больше ничего не нужно, то это должно быть private (это общий принцип: предоставьте как можно меньше доступа, насколько это необходимо).

5 голосов
/ 28 февраля 2011

Вы можете попробовать использовать бокс.

public class IntBoxer {
    public IntBoxer() {
    }
    public IntBoxer(int startValue) {
        this.value = startValue;
    }
    public int value;
}
IntBoxer a = new IntBoxer();
IntBoxer b = new IntBoxer();
IntBoxer p;
Switch(whatever){
    case 1:
      p=a;
      break;
    case 2:
      p=b;
      break;
}
lots_of_lines_dealing_with_pointer_p.value;
4 голосов
/ 28 февраля 2011

Да, это называется "метод":

private int lots_of_lines_dealing_with_value(int x)
{
  .
  .
  .
  return new_value;
}


int a,b;
Switch(whatever){
    case 1:
      p=lots_of_lines_dealing_with_value(a);
      break;
    case 2:
      p=lots_of_lines_dealing_with_value(b);
      break;
}
1 голос
/ 28 февраля 2011

В Java нет указателей, есть ссылки.

Указатель - это переменная, которая содержит адрес памяти. Обычно один разыменовывает указатель для получения памяти, необходимой для какой-либо операции.

Ссылка - это индекс в таблице управления памятью. Обычно таблица управления памятью защищена от прямого доступа. В случае Java ссылкой нельзя манипулировать вручную, так как любое чтение переменной приведет к возвращению ссылочного объекта.

Это имеет много последствий, но необходимо для достойного автоматического сбора мусора. Сборка мусора иногда включает в себя перемещение объектов в памяти для создания больших областей свободного пространства (для необходимых объектов, которые не могут поместиться в текущие дыры в памяти). Если Java предоставляет указатель, то после сжатия памяти у вас может быть «старый» адрес памяти.

При использовании ссылок ваша ссылка гарантированно останется прежней, даже если фактическое расположение памяти меняется. Внутренняя часть JVM является ссылкой на таблицу указателей, но вы никогда не увидите ее в работающей программе; потому что, если вы когда-нибудь коснетесь этого, это испортит автоматическое управление памятью.

1 голос
/ 28 февраля 2011

Почему ты не можешь просто сделать:

int a,b;

Switch(whatever){
    case 1:
      f(a);
      break;
    case 2:
      f(b);
      break;
    default:
      // ???
}
1 голос
/ 28 февраля 2011

Используйте класс Integer вместо int.

Чтобы дать вам пример, используя код, который у вас есть:

Integer a,b;
Integer p;
switch(whatever){
    case 1:
      p=a;
    case 2:
      p=b;
}
0 голосов
/ 28 февраля 2011

Ну, для этого сценария:

boolean useA;
int a, b;

if(useA)
      lots_of_lines_dealing_with_variable_a;
else
      same_lines_but_dealing_with_variable_b;

вы можете использовать:

boolean useA;
int a, b;

int value = useA ? a : b;

// lines_dealing_with_value

if(useA)
    a = value;
else
    b = value;

Но на самом деле. Методы!

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