Порядок инициализации статических переменных в Flex, вызывающий ошибку

#apache-flex #flex4 #static-members

#apache-flex #flex4 #статические элементы

Вопрос:

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

В принципе, у меня есть это:

 public class ModeChangeController {
    public static const DISPLAY_MODE:String = "DisplayMode";

}


public class Events {       
    public static const DISPLAY_MODE:String = "DisplayMode";

    public static function myStaticFunction( viewState:String = null):void {
        //Empty
    }
}



<?xml version="1.0" encoding="utf-8"?>
<s:BorderContainer /*snip*/ >

    <fx:Script><![CDATA[
        import mypackage.sub1.ModeChangeController;
        import mypackage.sub2.Events;

        private function showInitialView():void {
            // Variant 1
            Events.myStaticFunction( Events.DISPLAY_MODE);

            // Variant 2
            Events.myStaticFunction( ModeChangeController.DISPLAY_MODE);
        }
    ]]></fx:Script>
}    
  

Если я использую //V2 (т.Е. закомментирую V1), при запуске приложения возникает ошибка (некоторые текстовые поля не редактируются и не содержат текста), но с // V1, а не с V2, все работает нормально. Если я закомментирую оба, это также отлично работает (я не получаю ошибку TextField).

Мне потребовалось некоторое время, чтобы выяснить, что именно эта статическая строка const была причиной проблемы, но я все еще не уверен, почему и могу ли я что-то с этим сделать, за исключением простого перемещения DISPLAY_MODE в Events (что я и сделал на данный момент, но это не особенно приятное решение).

В журнале нет ошибок. Порядок включений в моем коде BorderContainer не имеет значения. Я поискал в Google «порядок статической инициализации as3 / flex», но ничего не нашел.

Кто-нибудь знает, в чем проблема?

Уточнение: showInitialView() никогда не вызывается. Это происходит не раньше, чем появляется другая ошибка. Проблема возникает только из-за наличия строки V2.

Обновление: я исправил проблему, из-за которой не отображались строки TextInput: оказывается, из-за добавления компонента шрифт Tahoma не отображался. Однако установка значения font-weight на bold устранила эту проблему или переключение на Arial. С учетом сказанного, первоначальный вопрос все еще остается в силе, потому что, когда я запустил его без версии V2, он обнаружил Tahoma с нормальным весом шрифта.

Комментарии:

1. Когда выполняется showInitialVie? Что произойдет, если вы используете отладчик и выполните эту строку? Поскольку myStaticFunction ничего не делает [согласно вашему коду] Мне очень трудно поверить, что любая из этих строк приведет к тому, что приложение будет инициализировано по-другому. Если только у вас не был установлен отладочный проигрыватель и вы не пропустили ошибку времени выполнения

2. Добавлено уточнение относительно вашего комментария.

3. Похоже, у вас проблема со встроенными шрифтами; которая не имеет ничего общего со статическими переменными.

Ответ №1:

Это не статическая строка. Я протестировал это сам без проблем. Я скептически отнесся к вашей проблеме, поскольку статические переменные flash будут создаваться при загрузке приложения, несмотря ни на что, и переменная будет доступна.

Я полагаю, что проблема не имеет ничего общего со статическим переменным, а с чем-то другим, вызывающим ошибку. Похоже, что у вас нет версии Flash Player debug по вашему описанию. Получите это, отладьте свое приложение построчно и посмотрите, в чем проблема.

Комментарии:

1. Извините, я должен был упомянуть, что этот код является очень упрощенной версией того, как он выглядит в компоненте. Я могу отладить код (через Eclipse / FB4), но «showInitialView» никогда не вызывается — смотрите Мое разъяснение.

2. Ваше разъяснение не имеет смысла, если вы выполняете отладку и возникает ошибка, где она? Если это происходит без сбоев, что вы делаете, чтобы это исправить? Простое наличие строки кода, которая не выполняется не в вашем приложении, не вызовет ошибку, если только у вас где-то нет статической переменной / функции, которая вызывает ошибку. Вы обвиняете в этом статический var, где со статическим var все в порядке. Причиной является что-то еще в вашем коде.

3. Обновил вопрос некоторой информацией. Я знаю, что это не имеет никакого смысла, вот почему я спрашиваю. 🙂 И да, наличие строки кода, которая не выполняется, ДЕЙСТВИТЕЛЬНО вызвало ошибку, независимо от того, имеет это смысл или нет. 😉

4. Вопрос не стоит, потому что вы удаляете информацию о своем собственном коде, и я могу изолированно сказать, что ваше первоначальное обвинение в неправильном создании экземпляров статических переменных является ложным. Это не ошибка проигрывателя Flash или компилятора, это что-то в вашем коде.

5. Я скажу вам, что это не обязательно связано с порядком инициализации статических переменных, но это единственный вывод, который имеет смысл для меня. Если это проблема с чем-то в остальной части кода, мне интересно, как / почему это проявляется только тогда, когда я удаляю вызов myStaticFunction с этой конкретной статической переменной в качестве параметра. Извините, я не могу включить больше исходного кода, но файлы довольно большие, вдобавок к тому, что они являются собственностью компании.