我正在查看Android 4.2中引入的新API 。在查看UserManager
类时,我遇到了以下方法:
public boolean isUserAGoat()
用于确定发出此呼叫的用户是否受到传送。
返回进行此调用的用户是否是山羊。
应该如何以及何时使用?
我正在查看Android 4.2中引入的新API 。在查看UserManager
类时,我遇到了以下方法:
public boolean isUserAGoat()
用于确定发出此呼叫的用户是否受到传送。
返回进行此调用的用户是否是山羊。
应该如何以及何时使用?
Answers:
从其来源开始,该方法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");
}
false
永远返回的人来说,我感到很难过。
我不知道这是否是“该”正式用例,但是以下内容在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
为if
,产生了一个比较晦涩的用例。我相信您可以通过这种行为使您的IDE(例如Eclipse)崩溃,但是此编辑工作将在4年后进行,而且我没有Eclipse环境可以使用。
else
块等
isUserAGoat()
如果用户安装了特定的应用程序,则返回true。祝您好运,当您的代码突然在“随机”设备上开始出现异常行为时,请进行诊断!
这似乎是Google的一个玩笑。Google Chrome任务管理器中也提供了该功能。它没有任何目的,只是一些工程师觉得它很有趣。如果您愿意的话,这本身就是一个目的。
Goats Teleported
列。甚至有大量的关于过多传送山羊的铬虫报告。
int TaskManagerModel::GetGoatsTeleported(int index) const {
int seed = goat_salt_ * (index + 1);
return (seed >> 16) & 255;
}
补充@djechlin 答案(顺便说一句好答案!),当您要停止某些特定的迭代或特定的递归调用时,此函数调用还可用作伪代码以在IDE中保存断点,例如:
isUserAGoat()
可以用来代替虚拟变量声明,该变量声明将在IDE中显示为警告,在Eclipse特定情况下,它将阻塞断点标记,从而使其难以启用/禁用。如果该方法用作约定,则以后所有调用都可以由某个脚本过滤(可能在提交阶段吗?)。
Google家伙是Eclipse的重度用户(他们提供了多个项目作为Eclipse插件:Android SDK,GAE等),因此@djechlin答案和这个补充性答案很有道理(至少对我而言)。
;
?我的意思是,山羊显然要好一些,但是已经有一种简单的方法可以解决这个问题
每个版本的Android中都有一个有趣的名为method / constant / every的东西。
我见过的唯一实际用途是在Google I / O的最新呼吁中竞赛,他们询问特定版本的用途,以查看参赛者是否阅读了每个版本的API差异报告。比赛也有编程问题,但通常来说,一些琐事可以首先自动评分,以使提交的数量降至合理的数量,以便于检查。
Google非常喜欢山羊皮和以山羊为基础的复活节彩蛋。甚至以前也有关于Stack Overflow的文章。
如前几篇文章所述,它也存在于Chrome任务管理器中(它于2009年首次出现在野外):
<message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column">
Goats Teleported
</message>
然后在Windows,Linux和Mac版本的Chrome(2010年初)中进行。实际上,“传送的山羊”的数量是随机的:
int TaskManagerModel::GetGoatsTeleported(int index) const {
int seed = goat_salt_ * (index + 1);
return (seed >> 16) & 255;
}
Google对山羊的其他提及包括:
据我所知,山羊和Google的最早关联属于原始的“用山羊割草”博客文章。
我们可以安全地假设它只是一个复活节彩蛋,除了return之外,没有实际用途false
。
从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文档中未说明的目的,那么您将面临麻烦。
if(false)
生产?来这里。如果这就是您的代码,那么这种实现更改将是您最少的问题。
有一个类似的调用,isUserAMonkey()
如果正在使用MonkeyRunner工具,则返回true 。SDK的解释与此奇怪。
public static boolean isUserAMonkey(){}
返回
true
用户界面当前是否被猴子弄乱了。
这是来源。
我希望这是在新的SDK工具(带有山羊皮的东西)的预期中添加的,并且实际上可以用来测试该工具的存在。
还可以看到类似的问题,即ActivityManager中的奇怪函数:isUserAMonkey。这是什么意思,有什么用?。
ActivityManager
报告monkey
ui压力测试工具是否已调用它,但我从未证实过。
这不是内心的玩笑
显然,这只是山羊模拟器的应用检查器 -Coffee Stain Studios撰写
如果您安装了山羊模拟器,那么您就是山羊。如果您没有安装它,那么您就不是山羊。
我想这更多是一个开发人员的个人实验,最有可能找到具有共同兴趣的人。