我正在查看Android 4.2中引入的新 API 。在查看UserManager
课程时,我遇到了以下方法:
public boolean isUserAGoat()
用于确定进行此呼叫的用户是否会受到传送。
返回进行此调用的用户是否是山羊。
应该如何以及何时使用它?
我正在查看Android 4.2中引入的新 API 。在查看UserManager
课程时,我遇到了以下方法:
public boolean isUserAGoat()
用于确定进行此呼叫的用户是否会受到传送。
返回进行此调用的用户是否是山羊。
应该如何以及何时使用它?
在 Android R 中,此方法始终返回 false。谷歌表示这样做是为了“保护山羊隐私”:
/**
* 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>
*
* <p>As of {@link android.os.Build.VERSION_CODES#R}, this method always returns
* {@code false} in order to protect goat privacy.</p>
*
* @return Returns whether the user making this call is a goat.
*/
public boolean isUserAGoat() {
if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.R) {
return false;
}
return mContext.getPackageManager()
.isPackageAvailable("com.coffeestainstudios.goatsimulator");
}
从他们的来源,该方法用于返回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;
例如)。
我替换while
了 for if
,产生了一个更晦涩的用例。我相信你可以用这种行为来绊倒你的 IDE,比如 Eclipse,但是这个编辑是 4 年后的未来,而且我没有 Eclipse 环境可以玩。
这似乎是谷歌的一个内部笑话。它也出现在 Google Chrome 任务管理器中。它没有任何目的,只是一些工程师觉得它很有趣。如果您愿意,这本身就是一个目的。
Goats Teleported
列。甚至还有一个巨大的 Chromium 错误报告,关于太多被传送的山羊。
int TaskManagerModel::GetGoatsTeleported(int index) const {
int seed = goat_salt_ * (index + 1);
return (seed >> 16) & 255;
}
作为@djechlin答案的补充(顺便说一句,答案很好!),当您想在某些特定迭代或特定递归调用中停止时,此函数调用也可以用作在 IDE 中保存断点的虚拟代码,例如:
isUserAGoat()
可以用来代替将在 IDE 中显示为警告的虚拟变量声明,并且在 Eclipse 特定情况下,将阻塞断点标记,使其难以启用/禁用。如果将该方法用作约定,则所有调用稍后都可以通过某些脚本过滤(可能在提交阶段?)。
谷歌的家伙是 Eclipse 的重度用户(他们将他们的几个项目作为 Eclipse 插件提供:Android SDK、GAE 等),所以@djechlin 的答案和这个互补的答案很有意义(至少对我来说)。
在每个版本的 Android 中都有一个有趣的命名方法/常量/任何东西。
我见过的唯一实际用途是在 Last Call for Google I/O竞赛中,他们询问特定版本是什么,以查看参赛者是否阅读了每个版本的 API 差异报告。比赛也有编程问题,但通常一些琐事可以首先自动评分,以将提交的数量降低到更容易检查的合理数量。
在语音识别学科中,用户分为山羊和绵羊。
例如,在第 89 页:
绵羊是语音识别工作异常出色的人,山羊是语音识别工作异常糟糕的人。只有语音识别器知道它们之间的区别。人们无法预测谁的声音会被轻松识别,谁的声音不会。最好的策略是设计界面,使其能够处理各种环境中的各种声音
也许,未来计划将Android用户标记为山羊,以便能够根据山羊的需求配置语音识别引擎。;-)
从 API 21(第一个 Android 5.0/Lollipop SDK)开始,它会检测是否安装了Goat Simulator应用程序:
/**
* 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将其用作无警告的建议if (false)
是一种潜在的灾难性策略。以前false
为每个设备返回的值现在返回一个看似随机的值:如果它在您的代码中埋得足够深,则可能需要很长时间才能找出新错误的来源。
底线:如果您不控制方法的实现并决定将其用于 API 文档中未说明的目的,那么您将遇到麻烦。
谷歌非常喜欢山羊和山羊复活节彩蛋。甚至以前的 Stack Overflow 上也有过关于它的帖子。
正如在之前的帖子中提到的,它也存在于 Chrome 任务管理器中(它于 2009 年首次出现):
<message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column">
Goats Teleported
</message>
然后在 2010 年初的 Windows、Linux 和 Mac 版本的 Chrome 中)。“Goats Teleported”的数量实际上是随机的:
int TaskManagerModel::GetGoatsTeleported(int index) const {
int seed = goat_salt_ * (index + 1);
return (seed >> 16) & 255;
}
其他谷歌对山羊的引用包括:
据我所知,goats 和 Google 最早的关联属于原始的“Mowing with goats”博客文章。
我们可以放心地假设它只是一个复活节彩蛋,除了返回之外没有任何实际用途false
。
有一个类似的调用,如果正在使用MonkeyRunner 工具isUserAMonkey()
,则返回 true 。SDK 的解释和这个一样好奇。
public static boolean isUserAMonkey(){}
true
如果用户界面当前正被猴子弄乱,则返回。
这是来源。
我希望这是在一个名为 something with a goat的新SDK工具的预期中添加的,并且实际上可以用于测试该工具的存在。
另请参阅类似的问题,ActivityManager 中的奇怪函数:isUserAMonkey。这是什么意思,它有什么用?.
有趣的复活节彩蛋。
在 Ubuntu 版本的 Chrome 中,在任务管理器 ( shift+ esc) 中,您可以通过右键单击添加一个在意大利语版本中为“Capre Teletrasportate”(传送山羊)的科幻专栏。
关于它的一个有趣的理论就在这里。
这不是一个内部笑话
显然它只是山羊模拟器的应用程序检查 器 - 由 Coffee Stain Studios
如果您安装了山羊模拟器,那么您就是山羊。如果你没有安装它,你就不是山羊。
我想这更像是一位开发人员的个人实验,最有可能找到有共同兴趣的人。