Подтвердить что ты не робот

Почему Android использует Ints вместо Enums

Чтение об Android. Я вижу много частей фреймворка, используя константы int для возвращаемого значения или значения конфигурации (как здесь в START_REDELIVER_INTENT) вместо enum, который, насколько мне известно, является лучшим вариантом по многим причинам, которые можно найти по всему миру, как это.

Итак, это заставляет меня задаться вопросом... почему Google решил использовать так много int's вместо enum's?

4b9b3361

Ответ 2

Операции с int происходят во много раз быстрее операций над перечислением.

Судите сами. Каждый раз, когда вы создаете enum, вы создаете как минимум:

1) Class-loader for it. 
2) You keep this object in memory. 
3) Since enum is static anonymous class - it will always hang in your memory (sometimes even after you close the application.) 

Что касается Service. В этом классе флаги в основном используются для сравнения и возвращают результат в класс выше (ContextWrapper). Но в принципе, если вы выкапываете в недрах Android SDK, вы сами обнаружите, что почти все эти флаги используются для операционных операций сдвига.

Даже в Java используют двоичные операции сдвига в JDK:

/**
 * Max capacity for a HashMap. Must be a power of two >= MINIMUM_CAPACITY.
 */
private static final int MAXIMUM_CAPACITY = 1 << 30;

Также вы можете посмотреть класс Window в Android SDK

/**
 * Set the container for this window.  If not set, the DecorWindow
 * operates as a top-level window; otherwise, it negotiates with the
 * container to display itself appropriately.
 *
 * @param container The desired containing Window.
 */
public void setContainer(Window container) {
    mContainer = container;
    if (container != null) {
        // Embedded screens never have a title.
        mFeatures |= 1<<FEATURE_NO_TITLE;
        mLocalFeatures |= 1<<FEATURE_NO_TITLE;
        container.mHasChildren = true;
    }
}

/** The default features enabled */
@SuppressWarnings({"PointlessBitwiseExpression"})
protected static final int DEFAULT_FEATURES = (1 << FEATURE_OPTIONS_PANEL) |
        (1 << FEATURE_CONTEXT_MENU);

Итак, причины - два (по крайней мере):

  • Меньшее потребление памяти.

  • Работает быстрее из-за побитовых операций.