适用于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 "if" is treate differently System.out.println("Unreachable code"); }
不过这是合法的:
while (isUserAGoat()) { System.out.println("Unreachable but determined at runtime, not at compile time"); }
所以我经常发现自己写了一个愚蠢的实用方法,以最快的方式去伪造一个代码块,然后在完成debugging的时候find所有对它的调用,所以只要实现不改变,就可以使用它。
JLS指出, if (false)
不会触发“无法访问的代码”的原因,这将打破支持debugging标志,即基本上这个用例(h / t @auselen)。 ( static final boolean DEBUG = false;
例如)。 我换了if
, while
if
产生一个更隐晦的用例。 我相信你可以通过这种行为来改变你的IDE,比如Eclipse,但是这个编辑是未来4年,我没有Eclipse环境来玩。
这似乎是Google的一个笑话。 它也在Google Chrome任务pipe理器中显示。 除了一些工程师觉得有趣外,没有任何目的。 如果你愿意,这本身就是一个目的。
- 在Chrome中,使用Shift + Esc打开任务pipe理器。
- 右键点击添加
Goats Teleported
列。 - 奇迹。
甚至还有一个关于太多传送山羊的铬报告。
下面的Chromium 源代码片段是从HN注释中被盗取的。
int TaskManagerModel::GetGoatsTeleported(int index) const { int seed = goat_salt_ * (index + 1); return (seed >> 16) & 255; }
补充@djechlin的答案 (顺便说一句, 答案很好!),这个函数调用还可以用作虚拟代码,当你想停止某个特定的迭代或者一个特定的recursion调用时,在IDE中保存一个断点,例如:
可以使用isUserAGoat()
来代替将在IDE中显示的虚拟variables声明作为警告,并且在Eclipse中特定情况下会阻塞断点标记,使其难以启用/禁用。 如果该方法用作约定,那么所有的调用都可以稍后通过一些脚本进行过滤(在提交阶段可能?)。
Google的工作人员是很多Eclipse用户(他们提供了几个Eclipse插件:Android SDK,GAE等),所以@djechlin的答案和这个互补的答案很有意义(至less对我而言)。
有一个有趣的命名方法/常量/无论在每个版本的Android。
我见过的唯一实际用途是在最后一次Google I / O竞赛中,他们询问了特定版本的内容,看看参赛者是否阅读每个版本的API差异报告。 比赛也有编程上的问题,但一般来说,一些琐事可以自动分级,以提交的数量下降到合理的数量,这将更容易检查。
Google非常喜欢山羊和山羊复活节彩蛋 。 甚至有关于它的以前的堆栈溢出的post 。
正如之前的文章中提到的,它也存在于Chrome任务pipe理器( 它在2009年首次出现 ):
<message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column"> Goats Teleported </message>
然后在2010年初的Windows,Linux和Mac版本的Chrome )。 “山羊传送”的数量实际上是随机的 :
int TaskManagerModel::GetGoatsTeleported(int index) const { int seed = goat_salt_ * (index + 1); return (seed >> 16) & 255; }
其他Google对山羊的引用包括:
- 用山羊割草
- 山羊是baaaahk
据我所知,山羊和谷歌最早的关联属于原来的“山羊割草”博客文章。
我们可以有把握地认为,这只是一个复活节彩蛋,没有现实世界的使用,除了返回false
。
在语音识别的学科,用户分为山羊和羊 。
例如在第89页 。
羊是语音识别工作得非常好的人,山羊是其工作特别差的人。 只有语音识别器知道什么将它们分开。 人们无法预测谁的声音会被轻易识别,谁的声音不会被识别。 最好的策略是devise界面,以便处理各种环境中的各种声音
也许,计划在将来将Android用户标记为山羊,以便能够为山羊的需求configuration语音识别引擎。 😉
从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"); }
这应该清楚地表明 , if (false)
是一个潜在的灾难性策略, djechlin的build议是将其作为一个无警告的使用。 之前为每个设备返回false
的返回值都是一个看似随机的值:如果这个代码被深埋在你的代码中,可能需要很长时间才能确定你的新bug是从哪里来的。
底线:如果您不控制方法的实施,并决定将其用于API文档中所述以外的目的,那么您就会遇到麻烦。
有一个类似的调用, isUserAMonkey()
,如果使用MonkeyRunner工具,则返回true。 SDK的解释和这个一样好奇。
public static boolean isUserAMonkey(){}
如果用户界面当前正被猴子混淆,则返回
true
。
这是来源。
我希望这是为了增加一个新的SDK工具,名字叫做山羊,并且实际上可以用来testing这个工具的存在。
另外看到一个类似的问题, ActivityManager中的奇怪函数是:isUserAMonkey。 这是什么意思,它有什么用? 。
在这个星球上最偏远的山区,有一种先进的山羊品种,就像我们人类一样,似乎目前能够使用手机!
泄漏的镜头: youtu.be/YJwZMUn7GdQ
谷歌一定已经发现了这一点,并决定为他们提供支持,试图留在技术进步的前沿。
有趣的复活节彩蛋。
在Ubuntu版本的Chrome中,在任务pipe理器( shift + esc )中,右键单击可以添加一个意大利语版本为“Capre Teletrasportate”(Teleported Goats)的科幻列。
关于它的一个有趣的理论在这里 。