协慌网

登录 贡献 社区

适用于 Android UserManager.isUserAGoat()的用例?

我正在研究Android 4.2 中引入的新 API。在查看UserManager类时,我遇到了以下方法:

public boolean isUserAGoat()

用于确定进行此呼叫的用户是否受传送的影响。

返回进行此调用的用户是否为山羊。

应该如何以及何时使用?

答案

从它们的来源 ,用于返回false的方法直到它在 API 21 中被更改。

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 * @return whether the user making this call is a goat 
 */
public boolean isUserAGoat() {
    return false;
}

看起来这个方法作为开发人员对我们没有实际用处。有人此前曾表示可能是复活节彩蛋

在 API 21 中,实现已更改为检查是否已安装包com.coffeestainstudios.goatsimulator应用程序

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

这是源链接

我不知道这是否是 “官方用例”,但是以下内容会在 Java 中产生警告(如果与return语句混合,可能会进一步产生编译错误,从而导致代码无法访问):

while (1 == 2) { // Note that "if" is treated differently
    System.out.println("Unreachable code");
}

但这是合法的:

while (isUserAGoat()) {
    System.out.println("Unreachable but determined at runtime, not at compile time");
}

因此,我经常发现自己编写了一个愚蠢的实用方法,用于最简单的方法来编写代码块,然后在完成调试时找到对它的所有调用,因此如果实现没有改变,则可以使用它。

JLS指出if (false)是否不会触发 “无法访问的代码”,因为这会破坏对调试标志的支持,即基本上这个用例(h / t @auselen)。 ( static final boolean DEBUG = false;例如)。

我更换whileif ,产生更模糊的使用情况。我相信你可以通过这种行为来引导你的 IDE,比如 Eclipse,但是这个编辑是未来 4 年,我没有 Eclipse 环境可以使用。

这似乎是谷歌内心的笑话。它也是谷歌 Chrome 任务管理器中的特色。除了一些工程师认为有趣之外,它没有任何意义。如果你愿意的话,这本身就是一个目的。

  1. 在 Chrome 中,使用Shift + Esc打开任务管理器。
  2. 右键单击以添加Goats Teleported列。
  3. 奇迹。

关于太多传送的山羊,甚至有一个巨大的 Chromium bug 报告。

铬

以下 Chromium 源代码段HN注释中被盗。

int TaskManagerModel::GetGoatsTeleported(int index) const {
  int seed = goat_salt_ * (index + 1);
  return (seed >> 16) & 255;
}