2013-09-12 2 views
3

Я рассмотрел некоторые другие подобные вопросы по SO, но они, похоже, не обращаются к следующим конкретно.static const - верхний уровень программы не позволяет статический const - Dart

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

У меня есть программа, которую я немного реорганизовал, чтобы де-загромождать. У программы были некоторые объявления const до «main()». Я переместил их в класс, однако мне потребовалось объявить их как «static const». Я тогда подумал, хорошо, что другие объявления «const» до «main()», вероятно, также должны быть «static const». Однако, когда я попытался это сделать, редактор сообщил, что «объявления верхнего уровня не могут быть объявлены« статическими ». НАПРИМЕР.

static const int I_CORRECT_YN  = 12; // prompt nr. 

Итак, я немного смущен. Я думал, что «const» является статичным. Почему я должен объявлять «статический» в классе? Почему я не могу объявить «верхний уровень» как «статический»? Кроме того, в чем разница между:

static const int I_CORRECT_YN = 12; 
const int  I_CORRECT_YN = 12; 
static final int I_CORRECT_YN = 12; 
final int  I_CORRECT_YN = 12; ? 

Что является лучшим или единственным способом объявить значение времени компиляции, которые не могут быть изменены?

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

ответ

3

Почему я должен объявить «статический» в классе?

Поскольку переменные экземпляра/методы не могут быть const. Это означало бы, что их значение может быть разным для каждого экземпляра, что не может иметь место для констант времени компиляции. (Source)

Почему я не могу объявить «верхний уровень» как «статический»?

Модификатор static маркирует переменные/методы как класс (одно значение для каждого экземпляра класса). Материалы верхнего уровня являются прикладными и не принадлежат ни одному классу, поэтому их маркировка как класс не имеет никакого смысла и не допускается. (Source)

Каков наилучший или единственный способ объявить значения времени компиляции, которые нельзя изменить?

Вы уже это сделали - добавьте static при определении констант класса. Не добавляйте его при определении констант верхнего уровня. Также используйте const. final vars не являются значениями времени компиляции.

В чем разница между [исходным кодом с различными постоянными определениями опущено]

static const и const является в значительной степени то же самым, использование зависит от контекста. Разница между const и final заключается в том, что const являются константами времени компиляции - они могут быть инициализированы только с использованием значений литерального выражения (или выражений, состоящих из операторов и буквенных значений) и не могут быть изменены.final переменные также не могут быть изменены после инициализации, но они в основном являются нормальными переменными. Это означает, что любой вид выражения можно использовать, а значение может быть другой один для каждого экземпляра класса:

import "dart:math"; 

Random r = new Random(); 
int getFinalValue() { 
    return new Random().nextInt(100); 
} 

class Test { 
    // final variable per instance. 
    final int FOO = getFinalValue(); 
    // final variable per class. "const" wouldn't work here, getFinalValue() is no literal 
    static final int BAR = getFinalValue(); 
} 

// final top-level variable 
final int BAZ = getFinalValue(); 
// again, this doesn't work, because static top-level elements don't make sense 
// static final int WAT = getFinalValue(); 

void main() { 
    Test a = new Test(); 
    print(Test.BAR); 
    print(BAZ);  // different from Test.BAR 
    print(a.FOO); 
    a = new Test(); 
    print(Test.BAR); // same as before 
    print(BAZ);  // same as before 
    print(a.FOO);  // not the same as before, because it is another instance, 
        // initialized with another value 
    // but this would still be a syntax error, because the variable is final. 
    // a.FOO = 42; 
} 

Я надеюсь, что это помогло, и я не описав это слишком запутанным. :]

+0

Да, я думаю, это объясняет это, спасибо. Я вернусь к нему позже. –

+0

Также обратите внимание, что конечные переменные инициализируются лениво при первом доступе. –

Смежные вопросы