Фатальное непонимание.

 
0
 
Java
ava
smartchecker | 04.10.2013, 18:00
В аттаче зависимость объектов.
Хочу в объекте B иметь ссылку на объект A, а получаю независимую копию объекта А.
Проясните суть.
Объекты самописные.
Comments (11)
ava
Stolzen | 04.10.2013, 17:23 #
Покажите лучше код
ava
smartchecker | 04.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
ava
smartchecker | 05.10.2013, 12:42 #
Причём в том месте, где ArrayList создаётся, судя по тому, что показывает debugger - всё происходит правильно.
А потом, когда я его в другом месте достаю что-то происходит не так.
ava
smartchecker | 05.10.2013, 12:47 #
Так... Я всё понял. Я - идиот!  smile 
Я, кажется, про это уже спрашивал.
Проблема в этом коде

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

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

Т.е. я хочу получить копию ArrayList'а и, очевидно, получаю не совсем то, что ожидаю.
Вопрос - как получить копию с нужным мне поведением?
ava
Stolzen | 05.10.2013, 16:03 #
Попробуйте убрать copy и оставить только t
ava
smartchecker | 05.10.2013, 20:34 #
Цитата (Stolzen @ 5.10.2013,  16:03)
Попробуйте убрать copy и оставить только t

Тогда результирующий ArrayList смотрит на те же объекты(см. аттач), а мне нужны идентичние, но независимые копии.
ava
Pawl | 06.10.2013, 08:39 #
А  как вообще работает ваш метод t.copy()? В коде, пожалуйста.
ava
smartchecker | 06.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.
Поэтому он остаётся старым.
ava
Pawl | 06.10.2013, 15:10 #
Цитата (smartchecker @  6.10.2013,  11:18 findReferencedText)
Я не знаю как присвоить правильный адрес объекту linkedTriad.

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

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

если потом вы в конструкторе public Operand(Operand origOper) потом все-равно присваиваете переменной linkedTriad ссылку на уже существующий объект класса Triad? Я имею ввиду оператор linkedTriad = origOper.linkedTriad; Может, лучше сделать так: linkedTriad = origOper.linkedTriad.copy()? А вообще, трудновато разобраться с куском большого проекта. Может, вам лучше упростить свой код до предела, чтобы локализовать проблему?
ava
smartchecker | 06.10.2013, 17:39 #
Цитата (Pawl @ 6.10.2013,  15:10)
Может, лучше сделать так: linkedTriad = origOper.linkedTriad.copy()?

Так будет безвылазная рекурсия.
ava
Pawl | 06.10.2013, 17:47 #
Цитата (smartchecker @  6.10.2013,  17:39 findReferencedText)
Так будет безвылазная рекурсия.

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

linkedTriad = origOper.linkedTriad;

просто присваивает переменной linkedTriad ссылку на объект, который уже есть в объекте origOper, а не создает копию этого объекта.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit