Подтвердить что ты не робот

Указатель на целое в Java

У меня есть код, подобный этому

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", который содержит два связанных списка в одном векторе. Целые числа, о которых я говорю, являются указателями на начало списков, которые мне нужно переместить в другие позиции списков при добавлении или удалении элементов в списки

4b9b3361

Ответ 1

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

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;

Ответ 2

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

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 (это общий принцип: как можно меньший доступ, насколько это необходимо).

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

int a,b;

Switch(whatever){
    case 1:
      f(a);
      break;
    case 2:
      f(b);
      break;
    default:
      // ???
}

Ответ 6

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

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

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

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

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

Ответ 7

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

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;

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