Запрет перезаписи переменной

250
13 декабря 2017, 23:31

У меня есть 4 переменных: x y z i. Каждая из переменных, каждый раз перезаписывается из-за принятий сообщений от сервера. Как запретить перезапись переменных x и y? Т.е. 1 раз он записывает, следующие разы, нет.

Answer 1

Вероятно, это уже не должны быть просто переменные и нужно писать какой-то «обвес». Самый элементарный — добавить условие. Например:

bool xset = false; // где-то на внешнем уровне
if (!xset) { 
    x = newx;
    xset = true;
}

Чуть посложнее — обернуть в функцию:

void setX(int newx) {
    static bool xset = false;
    if (!xset) { 
        x = newx;
        xset = true;
    }
}

Можно вовсе обернуть в класс переменную x и перегрузить оператор присваивания, в котором реализовать упомянутую выше логику и т.д.

Answer 2

Можно логику обернуть в класс, вроде такого:

template<typename T>
class SetOnce
{
public:
    SetOnce() = default;
    // Это оператор присваивания. Он будет вызываться при каждой
    // попытке записи в переменную.
    SetOnce<T> &operator=(const T &value)
    {
        // Если переменная ещё не записана, то записываем.
        // Иначе -- оставляем старое значение.
        if ( !m_isSet ) {
            m_isSet = true;
            m_value = value;
        }
        return *this;
    }
    operator T() const
    {
        return m_value;
    }
private:
    T m_value = T();
    bool m_isSet = false; // Это "флажок".
};

Потом его можно использовать так:

int main()
{
    // Делаем переменную типа int, в которую можно записать значение
    // только один раз.
    SetOnce<int> i;
    i = 10;
    std::cout << i << std::endl;
    // Выведет 10.
    i = 20;
    std::cout << i << std::endl;
    // Всё ещё 10, т.к. 20 не было записано.
    return 0;
}
READ ALSO
Проверка строки на число в потоке

Проверка строки на число в потоке

У меня Map<String,String> map может содержать в значении число в виде строкиЯ перебираю мапу циклом, проверяю регуляркой value

186
java.lang.NoClassDefFoundError: android/app/Activity ошибка при тестировании презентера

java.lang.NoClassDefFoundError: android/app/Activity ошибка при тестировании презентера

Я поставил задачу, покрыть приложение от ног до головы тестами, начал с презентеров

262
Оптимизация приложения

Оптимизация приложения

Есть пример кода программы:

251
Как правильно называть классы в Android?

Как правильно называть классы в Android?

Раньше я для каждого класса создавал свой АдаптерНо прочитав книгу про чистый код понял что это не правильно

221