Присвоение значения объекта другому - они не должны указывать одинаковые адреса в памяти - PullRequest
0 голосов
/ 16 марта 2011

У меня проблема с получением нового значения объекта.У меня есть такой код:

...
TimeSchedule[] offspringScheduleOne = new TimeSchedule[AVAILABLE_CLASSROOMS];
...
offspringScheduleOne[i] = genes.get(geneOneIndex).getSchedule()[i];
...

После этого назначения offspringScheduleOne [i] и genes.get (geneOneIndex) .getSchedule () [i] указывает тот же адрес памяти .Я хочу, чтобы: offspringScheduleOne[i] должно было получить значение genes.get(geneOneIndex).getSchedule()[i], они не должны быть одинаковыми, они просто должны иметь одинаковые значения .

Класс TimeSchedule:

public class TimeSchedule extends AlgorithmParameters {
    public int[][] timetable = new int[DAYS][HOURS];//DAYS and HOURS are static final variables that comes from AlgorithmParameters 

    public int[][] getTimetable() {
        return timetable;
    }

    public void setTimetable(int[][] timetable) {
        this.timetable = timetable;
    }
}

Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 16 марта 2011

На самом деле - это копирование значения, но вам необходимо понять, что это за значение.

Значение offspringScheduleOne[0] не является TimeSchedule объектом.Это ссылка на TimeSchedule объект. Ни у одного выражения в Java нет значения, которое является объектом. Очень важно, чтобы вы это поняли.

Теперь, если вам нужна копия объекта, выЯ должен сделать это самостоятельно.Например, вы можете включить метод clone() в TimeSchedule и написать:

offspringScheduleOne[i] = genes.get(geneOneIndex).getSchedule()[i].clone();

Другими словами, создать клон существующего объекта, а затем установить offspringScheduleOne[i] в качестве ссылкик этому вновь созданному объекту.Конечно, если какое-либо из полей в TimeSchedule является полем ссылочного типа, вам необходимо решить, нужно ли вам клонировать этот объект, а также ...

... или вы можете добавить конструктор и вызвать его, или другой метод, и т. д. Но вам нужно быть абсолютно ясным, что оператор присваивания является копированием значения, но это значение является ссылкой.

РЕДАКТИРОВАТЬ: Хорошо, теперь, когда вы опубликовали TimeSchedule, несколько предложений:

  • Прекратить использование открытых полей.Какой смысл иметь свойства, если поле общедоступно?
  • Вместо того, чтобы иметь свойства, возвращающие весь массив, измените их для доступа к отдельному часу, например,

    public int getTimetable(int day, int hour) {
        // TBD: Argument validation
        return timetable[day][hour];
    }
    
    // Similar for `setTimetable`
    
  • Создайте метод клонирования следующим образом:

    public TimeSchedule clone() {
        TimeSchedule copy = new TimeSchedule();
        for (int i = 0; i < timetable.length; i++) {
            copy.timetable[i] = timetable[i].clone();
        }
        return copy;
    }
    

    (Это немного расточительно в том смысле, что он создаст подмассивы, а затем отбросит их, но давайте сначала получим что-то, что работает ...)}

    public Test clone () {int [] [] scheduleCopy = new int [schedule.length] [];for (int i = 0; i

1 голос
/ 16 марта 2011

Вы должны создать новый объект TimeSchedule. Предполагая, что у вас есть конструктор копирования, вы можете использовать это:

TimeSchedule original = genes.get(geneOneIndex).getSchedule()[i];
TimeSchedule copy = new TimeSchedule(original);
offspringScheduleOne[i] = copy;

Конструктор должен скопировать значения из оригинала. Если у вас нет такого конструктора, вы можете вызвать методы get и set для копирования значений вручную.

TimeSchedule original = genes.get(geneOneIndex).getSchedule()[i];

TimeSchedule copy = new TimeSchedule();
copy.setFoo(original.getFoo());
copy.setBar(original.getBar());
// etc...

offspringScheduleOne[i] = copy;

Существует также метод clone, предназначенный для создания копий объектов, но его неудобно использовать, и, вероятно, лучше его избегать.

0 голосов
/ 16 марта 2011

Вы можете позволить TimeSchedule переопределить метод клонирования и написать

offspringScheduleOne[i] = genes.get(geneOneIndex).getSchedule()[i].clone();
...