2017-02-08 16 views
3

Я скопировал следующий класс из исходного кода Picasso's. На самом деле, я просил Picasso не кэшировать изображения.Побитовые операторы в java

Может ли один объяснить мне эти две линии

NO_CACHE(1 << 0), NO_STORE(1 << 1);

Я знаю об операторах поразрядными, я просто хочу знать, почему мы должны их здесь?

Они также подавлены PointlessBitwiseExpression предупреждение.

/** Designates the policy to use when dealing with memory cache. */ 
@SuppressWarnings("PointlessBitwiseExpression") 
public enum MemoryPolicy { 

    /** Skips memory cache lookup when processing a request. */ 
    NO_CACHE(1 << 0), 
    /** 
    * Skips storing the final result into memory cache. Useful for one-off requests 
    * to avoid evicting other bitmaps from the cache. 
    */ 
    NO_STORE(1 << 1); 

    static boolean shouldReadFromMemoryCache(int memoryPolicy) { 
    return (memoryPolicy & MemoryPolicy.NO_CACHE.index) == 0; 
    } 

    static boolean shouldWriteToMemoryCache(int memoryPolicy) { 
    return (memoryPolicy & MemoryPolicy.NO_STORE.index) == 0; 
    } 

    final int index; 

    private MemoryPolicy(int index) { 
    this.index = index; 
    } 
} 
+1

'NO_CACHE' имеет значение' index' '1',' NO_STORE' имеет значение 'index'' 2'. – QBrute

+0

Они используются для битмаскирования в методах. – Kayaman

+0

И какой-то странный синтаксис - это вызов частного конструктора enums. – Izruo

ответ

4

Вы спрашиваете, зачем они нужны? Этот код сводится к:

NO_CHACHE(1), NO_STORE(2); 

Вот это (и просто быть полным здесь: это те постоянные заявления просто вызывают, что частный конструктор перечисления принимает целочисленное значение).

Таким образом, ответьте на ваш вопрос: эти операции смены не нужны никаким образом! Они не имеют никакой дополнительной ценности (хуже: они, похоже, путают читателей)

Основная идея, вероятно, заключается в том, что в какой-то более поздний момент произойдет какое-то «бит-маскирование». И вы знаете, когда вы позже думаете о терминах «бит», у кого-то была отличная идея «думать в битах» при объявлении этих констант.

Но в этом случае, что-то вроде

NO_CACHE(0b01), NO_STORE(0b10); 

бы в значительной степени сделать работу тоже. Но даже это; Я бы не нашел нужным. Если это вообще, я предпочел бы разместить javadoc, выражая, что эти константы предназначены для использования в качестве «поразрядных флагов» позже.

+1

'@SuppressWarnings (" PointlessBitwiseExpression ")' именно поэтому они подавили это предупреждение? – mallaudin

+0

Есть предупреждение для этого? Если это так, скорее всего. ** Бессмысленно **. Бесценный! – GhostCat

+2

Это 'PointlessBitwiseExpression' может быть специфичным для IDE или статического анализа. –