Можно ли получить предыдущее значение переменной в Java?

См. Документы - https://fancyapps.com/fancybox/3/docs/#usage -

[..] использовать одно и то же значение атрибута data-fancybox для каждого из них создать галерею.

blockquote>

Итак, замените

data-fancybox-group="group_"

на

data-fancybox="group_"

6
задан GEOCHET 4 March 2009 в 15:12
поделиться

11 ответов

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

15
ответ дан 8 December 2019 в 02:11
поделиться

Не как собственная часть языка, нет. Вы могли записать метод set, который сохранил ток (предыдущий?) оценивают, когда Строка изменяется, все же.

private String str;
private String prev;

setStr(String s)
{
    prev = str;
    str = s;
}

Затем просто запишите отдельный метод считывания для prev.

Конечно, это решение полагается на Вас всегда использование метода set для изменения значения str.

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

11
ответ дан 8 December 2019 в 02:11
поделиться

Простой ответ, нет.

Однако Вы могли использовать:

AOP

AOP framwork, такой как AspectJ мог прервать присвоения на переменную.

Посмотрите ссылку AspectJ pointcut

Поддержка изменения свойства JavaBeans

Вы могли использовать стандартные методы set JavaBean, методы считывания для инкапсуляции поля. Затем можно зарегистрировать слушателей на бобе, чтобы прекратить слушать для изменений свойства и даже наложить вето на то изменение.

Посмотрите Спецификацию JavaBean для получения дополнительной информации.

Слушатель в качестве примера:

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;

public class MyBeanListener implements PropertyChangeListener,
        VetoableChangeListener {

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        System.out.printf("Notifed of property changed event: %s => %s%n", evt
                .getOldValue(), evt.getNewValue());

    }

    @Override
    public void vetoableChange(PropertyChangeEvent evt)
            throws PropertyVetoException {
        System.out.printf("Notified of vetoable change event: %s => %s%n", evt
                .getOldValue(), evt.getNewValue());
    }
}
5
ответ дан 8 December 2019 в 02:11
поделиться

Если у Вас действительно есть сильная необходимость в этом, Вы могли бы использовать следующий код:

public class Main 
{
    public static void main(final String[] argv) 
    {
        SavedValue<Integer> i;

        i = new SavedValue<Integer>();
        i.set(7);
        System.out.println(i.get());
        System.out.println(i.getOld());
    }
}

class SavedValue<T>
{
    private T oldValue;
    private T value;

    void set(final T val)
    {
        oldValue = value;
        value    = val;
    }

    T get()
    {
        return (value);
    }

    T getOld()
    {
        return (oldValue);
    }
}

Возможно, Вы могли объяснить, почему Вы хотите старое значение? Я уверен, что мы можем дать Вам намного лучшие ответы, если мы знали, почему yoiu хотел это.

4
ответ дан 8 December 2019 в 02:11
поделиться

Вы уже получили два простых ответа:

  • Нет, сам Java не позволяет это
  • Можно использовать методы set и реализовать механизм для хранения старого значения (значений)

Но существует третий, который я не видел до сих пор:

Должно быть возможно записать Аспект в AspectJ, который включает присвоение. Таким образом, это имело бы подобный эффект как метод set без фактического метода set. Если Вы работаете с кодом, что Вы не хотите или не можете измениться, это могло бы быть опцией.

Обратите внимание, что, в то время как AspectJ не является Java, результатом является нормальный код байта, таким образом, это должно быть совместимо с большинством сред.

Конечно, вместо того, чтобы использовать AspectJ Вы могли сделать это с CGLIB.

4
ответ дан 8 December 2019 в 02:11
поделиться

Похоже на использование этого для отладки действительно ли я прав?

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

Вы просто изменяете свойства нормальной точки останова для печати выполнения останова, а не оператора. В VS2005 это сделано:

  • Перевод в рабочее состояние окна точки останова
  • Щелчок правой кнопкой по точке останова
  • Выбор опции "When Hit...".
  • Выбор "Печати сообщение" и ввод сообщения
  • Удостоверение, что "Продолжают Выполнение", все еще выбрано.

Это обычно значительно замедляет программу при отладке, таким образом, это мало полезно для зависящей от времени отладки; но это все еще позволило мне следовать за состояниями переменной (ABCDFEGH...)

Конечно, если Вы действительно хотите остановить выполнение, просто выведите нормальную точку останова в.

2
ответ дан 8 December 2019 в 02:11
поделиться

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

1
ответ дан 8 December 2019 в 02:11
поделиться

В дополнение к тому, что сказал Stefan, я рекомендую структуру Списка некоторого вида, содержащего все исторические ценности.

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

1
ответ дан 8 December 2019 в 02:11
поделиться

Если бы Вы могли бы найти предыдущее состояние программы, никогда не было бы никакого мусора для сбора, и программа очень быстро исчерпает память.

Для определенных переменных Вы могли использовать, скажем, стек LIFO. Вместо присвоения Вы продвинули бы к стеку. Вместо того, чтобы читать переменную, Вы посмотрели бы. Содержание стека может быть исследовано для нахождения исторических ценностей.

Другой подход должен был бы использовать инструментарий. Это позволяет, Вы к, с достаточным навыком и терпением, переписываете код байта, чтобы сделать то, что когда-либо Вы хотите.

Возможно, Вы хотите отступить немного и посмотреть на то, чего Вы на самом деле пытаетесь достигнуть.

0
ответ дан 8 December 2019 в 02:11
поделиться

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

При использовании затмения можно установить точки останова, которые инициировали, когда переменная изменяется. Это могло бы достигнуть того, что я предполагаю, что Вы пытаетесь добраться до.

0
ответ дан 8 December 2019 в 02:11
поделиться

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

Gooogle Bil Lewis Historical Debugger для одного примера. Обратите внимание, что большая часть этого программного обеспечения находится на стадии, которую вы бы назвали «начальной бета-версией».

0
ответ дан 8 December 2019 в 02:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: