Enum вопрос ответ что делать
Перейти к содержимому

Enum вопрос ответ что делать

  • автор:

Enum вопрос ответ что делать

В форме аутентификации на сайте вам отображается число-вопрос

Мобильное приложение E-NUM получает PUSH-уведомление и отображает единственно верное число-ответ

Нажмите «Отправить число-ответ» в приложении E-NUM или сами введите число-ответ в форму — вы аутентифицированы!

Трудности при входе с помощью E-num Storage в WM Keeper WinPro

Для доступа к WMID, зарегистрированному в WM Keeper WinPro, вы можете использовать E-num авторизацию при помощи числа-ответа, получаемого в приложении E-num, установленном на вашем мобильном устройстве.

Для авторизации вам нужно предварительно установить на свое мобильное устройство приложение E-num, выполнив процедуру его получения. Если вы регистрировались в WM Keeper WinPro через файл ключей и у вас нет учетной записи в E-num, то вам нужно дополнительно выполнить регистрацию в системе E-num, после чего загрузить ключи от вашего WMID в E-num Storage через настройки WM Keeper WinPro. Для установки приложения E-num подойдут современные мобильные телефоны (смартфоны и планшеты).

1 Для входа в свою учетную запись WebMoney запустите программу WM Keeper WinPro, выберите место хранения ключей E-num Storage. В поле E-mail укажите электронную почту, на которую вы регистрировались в E-num (при условии, что вы загружали ваш WMID в E-num) или которая была указана вами при регистрации в WebMoney (при условии, что вы выполнили процедуру получения приложения E-num).

Указанное сообщение означает, что вы не зарегистрированы в E-num или ввели неверно свой e-mail. После нажатия Да вы перейдете на сайт e-num.com для регистрации.

Если программа сообщает, что данный метод не может быть использован, то значит вы не получали приложение E-num. Получить приложение вы можете выполнив процедуру восстановления и получив новый код активации приложения.

2 После ввода e-mail на экране вы увидите окно программы, где отображается число-вопрос, которое вам нужно указать в приложении E-num для получения числа-ответа, которое в свою очередь вам и нужно указать в WM Keeper WinPro для входа в ваш WMID.

3 Далее запустите приложение E-num на телефоне и выберите пункт Подтверждение действия. Если при запуске приложения у вас запрашивается активация, то вам нужно ввести код активации, который приходит к вам в SMS-сообщении в процессе получения приложения E-num. В меню Подтверждение действия введите число-вопрос, которое было отображено в окне WM Keeper WinPro, после чего автоматически сформируется число-ответ.

Это число-ответ вам нужно указать в соответствующем поле программы WM Keeper WinPro.

В случае ввода верного числа-ответа вы перейдете на диалог указания пароля для входа в WMID.

Указанное сообщение программы означает, что вы ввели неверное число-ответ. Возможно, вы неверно указали число-вопрос в приложении, либо неверно ввели число-ответ в WM Keeper WinPro. Убедитесь так же, что получаете число-ответ в меню Подтверждение действия, а не в меню Подтверждение платежа, предназначенном только для платежей. Не пытайтесь повторно указать те же число-вопрос и число-ответ, т.к. эти значения при каждом запросе формируются заново, старые при этом уже недействительны. Поэтому пробуйте заново получить число-ответ в приложении E-num, с новым числом-ответ, которое покажет WM Keeper WinPro. Если ошибка повторяется, скорее всего, приложение выдает неверные значения. Выберите меню Настройки в приложении и далее пункт Код активации. Введите код активации, который приходил к вам в SMS-сообщении, когда вы получали приложение E-num или производили последнее его восстановление (не путайте с числом-ответ по SMS). После указания кода активации попробуйте заново выполнить вход в свой WMID. Если ошибка не устранилась, то вам нужно получить новый код активации, присылаемый вам в SMS-сообщении. Перед новой установкой, вам нужно удалить старое приложение с вашего телефона.

Загадки Enum’ов

Перечисления появились в пятой версии Java и с тех пор крепко обосновались в наших приложениях. Работа с перечислениями почти не отличается от работы с любыми другими классами в Java. Но есть несколько особенностей, которые вызывают удивление. Каждый раз сталкиваясь с ними, хочется спросить: «Почему так?».

Давайте попробуем разобраться.

Порядок инициализации

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

  • нельзя наследоваться от классов (но можно реализовывать интерфейсы);
  • нельзя объявлять класс финальным или абстрактным;
  • нельзя создавать конструкторы с модификаторами public или protected ;
  • множество других ограничений (полный список можно найти в документации).

Хорошо, смирились с запретами. Но можем ли мы ожидать, что остальные языковые конструкции работают так же, как в остальной Java? Например, порядок инициализации объектов.

Давайте проверим. Для этого напишем такое перечисление:

public enum Pine < FIR, CEDAR; static < System.out.println("Static block"); > < System.out.println("Code block"); >Pine() < System.out.println("Constructor"); >>

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

var fir = Pine.Fir;

В обычных классах при инициализации первого объекта кодовые блоки выполняются в следующем порядке:

Статический блок -> Кодовый блок -> Конструктор 

Для перечисления же мы увидим в консоли следующее:

> Code block > Constructor > Code block > Constructor > Static block

Как же так? Почему статический блок был вызван последним?

Для ответа на этот вопрос давайте прогоним скомпилированный класс через Java Class File Disassembler и вручную переведем дизассемблированный код в java код. Дизассемблинг выполняется командой:

$ javap -c Pine

Для самых любопытных привожу результат исполнения команды.

Результат исполнения команды

public final class dev.boiarshinov.enumsinjava.initorder.Pine extends java.lang.Enum < public static final dev.boiarshinov.enumsinjava.initorder.Pine FIR; public static final dev.boiarshinov.enumsinjava.initorder.Pine CEDAR; public static dev.boiarshinov.enumsinjava.initorder.Pine[] values(); Code: 0: getstatic #1 // Field $VALUES:[Ldev/boiarshinov/enumsinjava/initorder/Pine; 3: invokevirtual #2 // Method "[Ldev/boiarshinov/enumsinjava/initorder/Pine;".clone:()Ljava/lang/Object; 6: checkcast #3 // class "[Ldev/boiarshinov/enumsinjava/initorder/Pine;" 9: areturn public static dev.boiarshinov.enumsinjava.initorder.Pine valueOf(java.lang.String); Code: 0: ldc #4 // class dev/boiarshinov/enumsinjava/initorder/Pine 2: aload_0 3: invokestatic #5 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; 6: checkcast #4 // class dev/boiarshinov/enumsinjava/initorder/Pine 9: areturn static <>; Code: 0: new #4 // class dev/boiarshinov/enumsinjava/initorder/Pine 3: dup 4: ldc #11 // String FIR 6: iconst_0 7: invokespecial #12 // Method "":(Ljava/lang/String;I)V 10: putstatic #13 // Field FIR:Ldev/boiarshinov/enumsinjava/initorder/Pine; 13: new #4 // class dev/boiarshinov/enumsinjava/initorder/Pine 16: dup 17: ldc #14 // String CEDAR 19: iconst_1 20: invokespecial #12 // Method "":(Ljava/lang/String;I)V 23: putstatic #15 // Field CEDAR:Ldev/boiarshinov/enumsinjava/initorder/Pine; 26: iconst_2 27: anewarray #4 // class dev/boiarshinov/enumsinjava/initorder/Pine 30: dup 31: iconst_0 32: getstatic #13 // Field FIR:Ldev/boiarshinov/enumsinjava/initorder/Pine; 35: aastore 36: dup 37: iconst_1 38: getstatic #15 // Field CEDAR:Ldev/boiarshinov/enumsinjava/initorder/Pine; 41: aastore 42: putstatic #1 // Field $VALUES:[Ldev/boiarshinov/enumsinjava/initorder/Pine; 45: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream; 48: ldc #16 // String Static block 50: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 53: return >

После ручного перевода в Java код получим следующее (не имеющий отношения к рассматриваемой теме код опущен):

public class PineIsNotEnum extends Enum  < public static final PineIsNotEnum FIR; public static final PineIsNotEnum CEDAR; protected PineIsNotEnum(String name, int ordinal) < super(name, ordinal); System.out.println("Code block"); System.out.println("Constructor"); >static < FIR = new PineIsNotEnum("FIR", 0); CEDAR = new PineIsNotEnum("CEDAR", 1); System.out.println("Static block"); >>

Что же мы видим? Значения перечисления превратились в статические финальные поля. Выражения из кодового блока и конструктора переехали в конструктор. Выражения из статического блока остались в статическом блоке, но до их вызова добавился код создания экземпляров.

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

> Code block > Constructor

И только после этого исполняется код из статического блока оригинального класса.

> Static block

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

Значения, объявленные в перечислении — это статические финальные поля того же типа, что и класс. Инициализация этих полей происходит в статическом блоке до всех остальных статических выражений.

Отсутствующие методы

Все перечисления неявно унаследованы от абстрактного класса Enum . Если заглянуть в javadoc на этот класс, то можно увидеть следующие методы:

String name() < /* . */ >int ordinal() < /* . */ >Class getDeclaringClass() < /* . */ >int compareTo(E o) < /* . */ >static > T valueOf(Class enumType, String name) < /* . */ >/* Методы класса Object */

Чего-то не хватает.

Если попробовать в IDE написать любое перечисление, поставить точку и вызвать автодополнение, то он предложит еще два метода:

Pine[] values = Pine.values(); Pine cedar = Pine.valueOf("CEDAR");

В исходниках класса Enum таких методов нет, но они как-то появляются в каждом перечислении.

Чтобы разобраться, обратимся к документации. Из нее мы узнаем, что два этих метода объявлены неявно. Почему неявно? Дело в том, что в отличие от других методов класса Enum эти методы не получается реализовать в абстрактном классе. Метод values() возвращает массив со всеми значениями перечисления, а класс Enum о них ничего не знает. Метод valueOf(String) возвращает конкретное значение перечисления по его названию. Можно было бы в нем вызвать метод valueOf(Class, String) :

public static E valueOf(String name)

Но ничего не выходит из-за того, что класс E невозможно извлечь в статическом контексте.

Почему же нельзя было объявить эти методы абстрактными в Enum , чтобы разработчики могли хотя бы ознакомиться с их контрактом в javadoc? Это невозможно из-за того, что методы не могут быть одновременно статическими и абстрактными. Компилятор не поймет. А методы valueOf(String) и values() по своей природе статические.

Теперь мы понимаем, что данные методы генерируются компилятором. Но какая же у них реализация? В JLS она не приведена, и в исходниках JDK ее тоже не найти.

Здесь нам поможет тот же трюк с дизассемблированием. В первой части статьи я сознательно не стал транслировать дизассемблированный код в Java-код полностью, чтобы не отвлекать внимание от инициализации. Если же пристальнее взглянуть на фрагмент под спойлером, то можно увидеть в дополнение к константам, описывающим значения перечисления, еще одну — VALUES . Она содержит в себе все значения перечисления в виде массива. Массив заполняется сразу после инициализации значений. Этот же массив возвращается при вызове метода values() :

/* . */ private static final PineIsNotEnum[] VALUES; static < FIR = new PineIsNotEnum("FIR", 0); CEDAR = new PineIsNotEnum("CEDAR", 1); VALUES = new PineIsNotEnum[] ; > public static PineIsNotEnum[] values()

Метод valueOf(String) реализуется с помощью вызова тезки:

public static PineIsNotEnum valueOf(String name)

Обобщая знания о неявных методах и порядке инициализации, давайте запишем как может быть представлено перечисление Pine из начала статьи в виде обычного класса:

public class PineIsNotEnum extends Enum  < public static final PineIsNotEnum FIR; public static final PineIsNotEnum CEDAR; private static final PineIsNotEnum[] VALUES; protected PineIsNotEnum(String name, int ordinal) < super(name, ordinal); System.out.println("Code block"); System.out.println("Constructor"); >static < FIR = new PineIsNotEnum("FIR", 0); CEDAR = new PineIsNotEnum("CEDAR", 1); VALUES = new PineIsNotEnum[] ; System.out.println("Static block"); > public static PineIsNotEnum[] values() < return VALUES.clone(); >public static PineIsNotEnum valueOf(String name) < return Enum.valueOf(PineIsNotEnum.class, name); >>

Заключение

Странности в перечислениях вызваны архитектурными решениями и ограничениями, выбранными разработчиками Java. С помощью дизассемблирования нам удалось узнать, как перечисления инициализируются, и как в них реализованы неявные методы.

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

Источники

  • Java Language Specification;
  • Статья о порядке инициализации перечислений в блоге Oracle;
  • Ответ о порядке инициализации перечислений на StackOverflow.

Использование E-num

E-num – это система авторизации, предоставляющая доступ к сервисам системы WebMoney Transfer посредством секретного ключа (уникального шифроблокнота), который хранится в мобильном устройстве (телефон, смартфон, планшет) участника. Система позволяет хранить ключи программы WM Keeper в своей базе данных (E-num Storage), что дает возможность безопасно пользоваться своими электронными кошельками, а также сервисами WebMoney практически на любом компьютере.

Система E-num проста и удобна. Авторизация происходит по схеме «Вопрос-ответ» следующим образом.

  1. На странице сайта (или в программе), предусматривающей защищённый доступ, участник видит свой email, далее отображается число-вопрос;
  2. Участник запускает в своем телефоне мобильный клиент E-num, приложение WM Keeper для Android или WM Keeper для iOS и вводит число-вопрос. После ввода, на дисплее телефона отображается число-ответ;
  3. Участник вводит число-ответ в поле авторизации на сайте (или в программе WM Keeper) и получает доступ к защищённым разделам сайтов или подтверждает выполнение операции (перевод средств, добавление корреспондента и др.).

Сервис E-num дает участникам следующие возможности.

  • Регистрироваться в системе, проводить настройку, восстанавливать доступ;
  • Использовать дополнительный безопасный способ входа в WM Keeper;
  • Подтверждать авторизацию на сервисах WebMoney при выполнении важных операций;
  • Подтверждать переводы средств, оплату услуг и проведение других операций в WM Keeper;

1. Регистрация, настройка, восстановление доступа¶

Для регистрации в системе E-num необходимо иметь E-mail, номер мобильного телефона и как минимум одно из устройств:

  • смартфон или планшет с ОС Android;
  • iPhone, iPad или iPod Touch с Apple iOS.

Адрес электронной почты, указываемый в Аттестате Вашего WMID WebMoney Transfer, необходимо использовать и в сервисе E-num.

Зарегистрироваться в системе E-num можно тремя способами:

  • самостоятельно на сайте сервиса — https://e-num.com ;
  • автоматически при подтверждении оплаты или авторизации на сайтах системы;
  • из приложения E-num клиент ( на Android и iOS );
  • новые участники системы WebMoney Transfer, использующие мобильное приложение, могут зарегистрироваться в сервисе E-NUM автоматически.

Пошаговая инструкция по регистрации в системе E-num приведена в основной статье Регистрация в сервисе E-num. Порядок действий при авторегистрации — в дополнительных инструкциях: Создание E-num аккаунта на сервисе Мерчант и Создание E-num аккаунта при подтверждении авторизации.

Реализация возможностей системы E-num осуществляется с использованием мобильного клиента или мобильного приложение WM Keeper для Android. Описание процедур установки и настройки E-num клиентов для различных платформ смотрите в статье E-num клиент и Подтверждение операций в Keeper Android.

Инструкцию по установке параметров E-num аккаунта смотрите в статье Настройка учетной записи E-num.

При утере доступа к E-num аккаунту воспользуйтесь инструкциями по восстановлению.

2. Вход в WM Keeper при помощи сервиса E-num¶

Enum-авторизацию можно использовать как дополнительный безопасный способ входа в WM Keeper WinPro. В этом случае ключи доступа к WMID записываются в специальное хранилище сервиса — E-num Storage, и необходимость хранить их на локальном компьютере отпадает.

Последовательность действий для подключения данной функции приведена в инструкции: Вход в WM Keeper при помощи сервиса E-num.

3. Дополнительная авторизация на сервисах WebMoney¶

Авторизация на сайтах системы WebMoney с использованием E-num представляет собой дополнительный этап аутентификации при выполнении наиболее важных операций в системе:

  • изменение ключевых персональных данных;
  • настройка безопасности;
  • перевод средств по доверию на сервисах системы;
  • оплата через сервис Merchant;
  • размещение заявки и выдача средств на кредитной бирже;
  • открытие лимита доверия в Долговом сервисе;
  • и другие операции.

О подключении данной функции и особенностях ее использования читайте статью Дополнительная авторизация при помощи E-num.

4. Подтверждение операций с помощью E-num¶

Функция подтверждения операций с помощью E-num позволяет участникам значительно повысить безопасность ключевых операций при работы со своим WM Keeper. К таким операциям относятся:

  • прямой перевод WM с кошелька на кошелек;
  • оплата счета;
  • добавление корреспондента;
  • смена ключей WM Keeper WinPro;
  • смена места хранения ключей WM Keeper WinPro);
  • сохранение копии ключей WM Keeper WinPro.

При подключении функции подтверждения с помощью E-num для проведения всех подобных операций будет требоваться дополнительное подтверждение с использованием мобильного E-num клиента, приложения WebMoney Keeper для Android или приложения WebMoney Keeper для iOS.

Последовательность действий при подключении и использовании данной функции смотрите в статьях Подтверждение операций при помощи сервиса E-num , Подтверждение операций в Keeper Android и Подтверждение операций в Keeper на устройствах с Apple iOS

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *