Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Фатальное непонимание.


Автор: smartchecker 4.10.2013, 17:00
В аттаче зависимость объектов.
Хочу в объекте B иметь ссылку на объект A, а получаю независимую копию объекта А.
Проясните суть.
Объекты самописные.

Автор: Stolzen 4.10.2013, 17:23
Покажите лучше код

Автор: smartchecker 4.10.2013, 17:49
Цитата(Stolzen @ 4.10.2013,  17:23)
Покажите лучше код

Ну как-то так...
Код

        Stack triadStack = new Stack();
        triadList = new ArrayList<Triad>();
        Operand ops[];
        Triad linkedTriad;
// cut
                    ops = new Operand[2];
                    for (int i = 1; i >= 0; i--) {
                        if (triadStack.lastElement().getClass().isAssignableFrom(Triad.class)) {
                            linkedTriad = (Triad) triadStack.pop();
                            ops[i] = new Operand(linkedTriad);
                            ops[i].setLink(triadList.indexOf(linkedTriad));
                        } else if (triadStack.lastElement().getClass().isAssignableFrom(String.class)) {
                            ops[i] = new Operand((String)triadStack.pop());
                        }
                    }
                    triadList.add(new Triad(curT.getText(), ops));
                    triadStack.push(triadList.get(triadList.size() - 1));
// cut

И в другом месте я ожидаю что вот этот код вернёт мне индекс в ArrayList'е этого объекта
Код

            trd = triadList.get(i);
// cut
        triadList.indexOf(trd.getOp(j).getLinkedTriad())
// cut

Автор: smartchecker 5.10.2013, 12:42
Причём в том месте, где ArrayList создаётся, судя по тому, что показывает debugger - всё происходит правильно.
А потом, когда я его в другом месте достаю что-то происходит не так.

Автор: smartchecker 5.10.2013, 12:47
Так... Я всё понял. Я - идиот!  smile 
Я, кажется, про это уже спрашивал.
Проблема в этом коде
Код

        ArrayList<Triad> afterFoldingTriadList = new ArrayList<Triad>();

        for (Triad t : triadList) {
            afterFoldingTriadList.add(t.copy());
        }

Т.е. я хочу получить копию ArrayList'а и, очевидно, получаю не совсем то, что ожидаю.
Вопрос - как получить копию с нужным мне поведением?

Автор: Stolzen 5.10.2013, 16:03
Попробуйте убрать copy и оставить только t

Автор: smartchecker 5.10.2013, 20:34
Цитата(Stolzen @ 5.10.2013,  16:03)
Попробуйте убрать copy и оставить только t

Тогда результирующий ArrayList смотрит на те же объекты(см. аттач), а мне нужны идентичние, но независимые копии.

Автор: Pawl 6.10.2013, 08:39
А  как вообще работает ваш метод t.copy()? В коде, пожалуйста.

Автор: smartchecker 6.10.2013, 11:18
Цитата(Pawl @ 6.10.2013,  08:39)
А  как вообще работает ваш метод t.copy()? В коде, пожалуйста.

Ну как-то так

Код

    public Triad(Triad origTriad) {
        operation = origTriad.operation;
        trd_const = origTriad.trd_const;
        constVal = origTriad.constVal;
        ops = new Operand[origTriad.ops.length];
        refCount = origTriad.refCount;

        for (int i = 0; i < origTriad.ops.length; i++) {
            ops[i] = new Operand(origTriad.ops[i]);
        }
    }

    public Triad copy() {
        return new Triad(this);
    }

Код

    public Operand(Operand origOper) {
        value = origOper.value;
        opType = origOper.opType;
        opConst = origOper.opConst;
        link = origOper.link;
        constValue = origOper.constValue;
        linkedTriad = origOper.linkedTriad;
    }

    public Operand copy() {
        return new Operand(this);
    }

Я не знаю как присвоить правильный адрес объекту linkedTriad.
Поэтому он остаётся старым.

Автор: Pawl 6.10.2013, 15:10
Цитата(smartchecker @  6.10.2013,  11:18 Найти цитируемый пост)
Я не знаю как присвоить правильный адрес объекту linkedTriad.

Честно говоря, не понял, зачем реализовывать метод 
Код

    public Triad copy() {
        return new Triad(this);
    }

если потом вы в конструкторе public Operand(Operand origOper) потом все-равно присваиваете переменной linkedTriad ссылку на уже существующий объект класса Triad? Я имею ввиду оператор linkedTriad = origOper.linkedTriad; Может, лучше сделать так: linkedTriad = origOper.linkedTriad.copy()? А вообще, трудновато разобраться с куском большого проекта. Может, вам лучше упростить свой код до предела, чтобы локализовать проблему?

Автор: smartchecker 6.10.2013, 17:39
Цитата(Pawl @ 6.10.2013,  15:10)
Может, лучше сделать так: linkedTriad = origOper.linkedTriad.copy()?

Так будет безвылазная рекурсия.

Автор: Pawl 6.10.2013, 17:47
Цитата(smartchecker @  6.10.2013,  17:39 Найти цитируемый пост)
Так будет безвылазная рекурсия.

Тогда однозначно упрощай задачу и выкладывай код сюда. Потому что однозначно код
Код

linkedTriad = origOper.linkedTriad;

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)