java - 正确使用安卓的UserManager.isUserAGoat( )?

  显示原文与译文双语对照的内容

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

公共布尔 isUserAGoat ( )

用于确定进行这里调用的用户是否受teleportations的影响。

返回这里呼叫的用户是否为山羊。

如何和什么时候使用这里选项?

时间:

从它们的,返回 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 语句混合,则可以进一步产生编译错误,从而导致无法到达的代码) 中产生警告:


if(1 == 2) {
 System.out.println("Unreachable code");
}

但这是合法的:


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

所以我经常发现自己编写了一个愚蠢的工具方法,以最快的方式模拟代码块,然后在完成调试时找到所有调用,所以提供的实现不会改变它。

这似乎是一个在谷歌里面的笑话。 它也在 Google Chrome 任务管理器中。 它没有目的,除了一些工程师发现它有趣。 它本身就是一个目的,如果你愿意。

  1. 在 Chrome, 打开任务管理器 + Esc转变。
  2. 右键单击以添加 Goats Teleported 列。
  3. Wonder 。

甚至有一个巨大的铬 Bug 报告关于的传输山羊

chrome

下列 Chromium 源代码 Fragment 。从注释中被窃取。


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

补充 @djechlin 回答 ( 好的答案是), 这个函数调用也可以使用伪代码在ide举行一个断点当你想停止在某些特定的迭代或者一个特定的递归调用,例如: !

enter image description here

isUserAGoat() 可以使用,而不是一个虚拟变量声明在ide将显示警告,在 Eclipse 特定情况下,将堵塞断点标志,使得它难以启用/禁用它。 如果该方法用作一个约定,那么所有的调用都可以被一些脚本( 在提交阶段可能) 过滤掉。

enter image description here

Google Eclipse guys是重量级的用户( 他们提供了一些项目作为 Eclipse 插件: Androidsdk,gae等等),所以 @djechlin 答案这很多意义( 至少对于我来说) 补充回答。

谷歌对基于山羊和山羊的复活节彩蛋有严重的偏爱。 甚至有以前的堆栈溢出日志,它

就像前面文章中提到的,它也存在于 Chrome 任务管理器( 首次出现在 2009的中) 中:


<message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column">
 Goats Teleported
</message>

,然后在 Windows,Linux和 Chrome 早期 2010的版本中。 "山羊传送"的数目实际上是随机:


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

其他对山羊的谷歌引用包括:

最早的"用山羊割草"和谷歌的相关性属于原始的博客文章,我知道。

我们可以安全地假设它只是一个复活节彩蛋,没有实际的使用,除了返回 false

有一个类似的调用 isUserAMonkey(),如果使用 MonkeyRunner工具,则返回真。 SDK解释和这个一样有趣。


 static boolean isUserAMonkey()
 Returns"true" if the user interface is currently being messed with by a monkey.

这里的是源。

我希望这是添加新的SDK工具命名的预期有一只山羊,实际上将功能测试工具的存在。

还可以看到类似的问题, 在ActivityManager中的奇怪功能: isUserAMonkey-这意味着什么,它的用途是什么? 。

在 API 21 ( 第一个 Android 5.0/Lollipop SDK ) 中,这个检测是否安装了山羊模拟器 app:


/**
 * 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");
}

这应该表明对 djechlin 使用它作为 warning-free if (false)的建议是一个潜在灾难性的策略。 以前为每个设备返回的false 现在返回一个看似随机的值: 如果这是足够深埋在你的代码可能需要一个长时间找出新的Bug 来自哪里。

底线:如果你不控制方法的实现,并决定将它的用于API文档之外的其他用途,你就会遇到麻烦。

...