Java中的位运算符

3
我从Picasso的源代码中复制了以下类。实际上,我要求Picasso不要缓存图像。
有人可以解释一下这两行吗?
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_CACHEindex 值为 1NO_STOREindex 值为 2 - QBrute
它们在方法中用于位掩码。 - Kayaman
而那种有点奇怪的语法是对“enums”私有构造函数的调用。 - Izruo
1个回答

4
你问为什么我们需要它们?这段代码可以简化为:
NO_CHACHE(1), NO_STORE(2);

这就是全部内容(为了完整起见:这些常量声明只是调用一个带有int值的私有构造函数的枚举)。
因此,你问题的答案是:这些位移操作在任何情况下都不需要!它们没有额外的价值(更糟糕的是:它们似乎会让读者感到困惑)。
其基本思想可能是在稍后某个时间点进行某种“位掩码”操作。你知道,在以后考虑“位”时,有人想到了在声明这些常量时也要“思考位”。
但在那种情况下,像这样的东西:
NO_CACHE(0b01), NO_STORE(0b10);

使用这种方法基本上也可以完成工作。但即使如此,我也不会觉得有多大帮助。如果必须这样做,我宁愿在那里放置一个Javadoc,表达这些常量旨在稍后用作“按位标志”。


1
@SuppressWarnings("PointlessBitwiseExpression") 这就是为什么他们抑制了这个警告的原因吗? - mallaudin
2
PointlessBitwiseExpression 可能是 IDE 或静态分析工具特定的。 - Mark Rotteveel
1
我就是这么想的... 我加上那句话是有原因的 ;-) - GhostCat
1
@mallaudin,我会写12并添加注释,说明这些常量分别是1 << 01 << 1的结果,而不是添加依赖于IDE的注释。 - Andrew Tobilko
2
@KlitosKyriacou 像往常一样:视情况而定。但我宁愿选择“反模式”。你知道:Java旨在成为更高级的面向对象语言。当然,有时候你确实需要处理那些低级的位运算问题;这种枚举类型是隐藏这些问题的一种选择。但请注意:最终用户仍然要将int值传递到这些方法中。这些值必须从某个地方获取。所以你有一个定义了非int策略的枚举类型;但然后你必须使用那些奇怪的接受int参数的方法?长话短说:如果我要审查这个...会发现很多问题;-) - GhostCat
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接