我在看Android4.2中引入的新API。在查看UserManager类时,我遇到了以下方法:
1
| public boolean isUserAGoat() |
Used to determine whether the user making this call is subject to teleportations.
Returns whether the user making this call is a goat.
应如何以及何时使用?
- @马丁代尔:你说的都不是真的;这不是一个事件,也不是内部事件,也不是记忆管理技术。参考它的代码而不是假设…:)
- 如果可以用来避免一些Java警告,作为复活节彩蛋,并作为一个测试来查看谁读取了API。这是一个关于铬质复活节彩蛋的参考。
- 这可能与谷歌在其山景总部使用山羊作为割草机有关。
- 谷歌似乎出于某种原因喜欢山羊,难怪他们用山羊做了一个复活节彩蛋。还有一个严重的!!)对山羊的投资:如谷歌博客所写——用山羊割草——山羊是Baaahk——毕竟它们是本地的草坪搬运工,效率也很高。
- 第一个死星开发者android.com/reference/android/hardware/…和电视节目lost developer.android.com/reference/android/hardware/…也有重力常数,当然是数字。
- 这应该作为我昨天读到的另一个关于"最奇怪/最奇怪/wtf"类型语言特性lol的问题的答案。
- JavaDocs似乎很清楚,当您需要知道进行调用的用户是否需要进行远程传输时,会出现此方法的正确用例。还有什么更清楚的?
- 他们甚至在棒棒糖之后更新了文档:"就棒棒糖而言,这种方法现在可以使用先进的山羊识别技术自动识别山羊。"
- 谷歌不应该让喜剧演员签入代码。
- 这个函数有点误导性——chrome包含一个山羊模拟器。这些是虚拟山羊。显然,传送本地山羊是禁止的。
- 这个问题是基于一个"笑话",并产生一个闪族效应。有可能,所讨论的API调用是由谷歌公司发起的社会/公关实验,其最终目标可能是推广其品牌、产品和服务,以及建立客户忠诚度。这个问题必须被视为间接(病毒式)营销和品牌推广,因此应该关闭,并标记为间接推广企业品牌。
- @你一定在开玩笑。你一定是那种"我被冒犯"的人。
- @Ovidiolatcu:我并不是暗示问这个问题可能有商业目的,或者代表社会传播的一个实验,但是添加API调用的动机可能远远超过了"只是玩得开心"。
从它们的来源来看,该方法用于返回false,直到在api 21中对其进行了更改。
1 2 3 4 5 6 7 8
| /**
* 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的应用程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| /**
* 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");
} |
这是来源和变化。
- 理论:山羊生活在各种不稳定的地方,比如陡峭的悬崖上,很可能与它们从普通的非山羊用户那里得到的位置趋势背道而驰。也许可以解释"远程传送",即当软件试图通过为非山羊设计的算法来确定它们的位置时,山羊似乎会疯狂地重新定位。
- EDCOX1,0,但是这不是Java…
- 这个答案如何在问题已经显示的信息中添加任何内容?
- @拉什-一个的来源。
- 这是历史课,不是答案。即使是复活节彩蛋,是否有一个有效的使用案例?做一个复活节彩蛋并不能排除它的用处,你也不能证明它是否有用。
- @Djechlin,源的一个方面是信息性的,现在答案已经被编辑了,更明显的是:(这个实现)这个方法总是返回false。
- 该方法可以在测试方案中被重写。
- 它还引用了en.wikipedia.org/wiki/the_men_who_stude at_goats,讲述了一个涉及山羊的美国军事项目。
- monkey函数用于检测另一个答案中指定的monkeyrunner调试工具。
- 他们需要增加canPigsFly()。while (!canPigsFly()) { /* code */ }
- 这是一个真正的应用程序。
- 我为那些冒失地使用这个函数,期望它永远返回false的人感到难过。
- @casperone给出了这个方法的内容,我认为这个用例很容易解释。
- 有趣的是有一个ID为play.google.com/store/app s/&hellip;的应用程序。它不是免费的,也不是谷歌制造的!
- 它如何知道用户是山羊、猴子还是其他什么东西??
- ??我不能被认作山羊吗?这是歧视安卓:(
- @是的,他们使用了那个应用的ID,他们没有随机选择一个应用的ID,然后碰巧有人用这个ID创建了一个应用…
- app可通过amazon app store amazon.com/coffee-stain-studios-goat-simulator/dp/b013knq2ms免费获得。
我不知道这是否是"官方"用例,但是下面在Java中产生警告(如果与EDCOX1,3个语句混合,会导致编译错误,导致不可达代码):
1 2 3
| while (1 == 2) { // Note that"if" is treated differently
System. out. println("Unreachable code");
} |
但这是合法的:
1 2 3
| 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;)。
我用if替换了while,产生了一个更加模糊的用例。我相信你可以像Eclipse一样,通过这种行为绊倒你的IDE,但是这个编辑是4年后的事情了,我没有Eclipse环境可以使用。
- 您是否尝试过if(false)statement;?
- 我的错——这些是警告,但是如果您从一个控制流现在被强制关闭的块返回,它们通常会导致实际的编译错误。
- 对于您想要编译的条件,编译器指令不是更好的用途吗?
- 如果(boolean.false)…}通常是有效的。
- 我不知道这是否只是Android,在标准的Java中,如果(false){…}编译得很好(打开JDK Javac 1.6和1.7)
- @Josefx-编译器警告,如果强制执行代码的分支有一个return语句,则可能导致错误,因为这会产生无法访问的代码。这是一个有用的编译器错误;例如,如果您忘记了开关中的break;语句,而您的default案例抛出了异常,则会得到此错误。
- @Djechlin很抱歉,在看到你的(1==2)示例后,我不知怎么地没能读懂你的第一句话——如果编译器处理了(false),那么在这种情况下就不好了(我应该睡一觉以避免更多的错误:)。
- @如果你想测试一个if为假或真的代码分支,这是最精确和最明显的方法来模拟它。如果你不匹配块的正确结尾(也许你没有注意到后面紧接着的一个谨慎的if/else块),那么对该块的注释就不太准确了,这将导致如果强制执行以下else块等,则会出现编译错误。
- 对于"if(false)",请检查docs.oracle.com/javase/specs/jls/se7/html/jls-14.html jls-14&zwnj;&8203;.21的末尾。
- DirkJ和228,CKEL,对,我忘了爪哇没有这些。
- 这是合法的,因为子类可以重写IsUserAgat()并返回不同的值。
- @不,编译器将检测到始终计算为真的值。
- 可能是因为isUserAGoat不是最终版本。
- "前提是实现不会改变"-这就是问题所在。这是一种灾难性的实现无警告"if(false)"的方法,因为实现可以并且确实会发生更改。请看我对这个问题的回答:从api21开始,如果用户安装了特定的应用程序,isUserAGoat()返回true。幸运的是,当您的代码突然开始在"随机"设备上出现异常行为时,您可以诊断出这一点!
- @如果山羊开始使用这种装置。
- @如果山羊开始使用Android设备,这将是我们遇到的最不重要的问题。
- @不,不是的,你真的试过吗?
- @那是什么意思?
- @djechlin if(false) {/* stuff */}未编译。
- @我猜你是对的。当然,这个答案长期以来都是错误的(我至少有一次机会读到JLS的引文并意识到这一点)。如果发生"Eclipse警告/错误",那么它可能足够重要,可以保持在周围,但是由于缺少Eclipse环境,我将很难进行检查。至少,我认为这在技术上是事实。
- 请你删除上面提到的误导性评论(StAdvExoal.COM/Quals/ 13375357//Helcli.)-很多人都知道他的答案,而且,因为新手通常相信高度受欢迎的东西,所以我们实际上在教育新成员EDCOX1(7)是爪哇的编译错误。
- 您是否尝试使用/*和*/来注释代码?
- @Jonasdralle这显然是一个荒谬的答案,但是对于已经有/**/的代码来说,这是行不通的。如果以结尾,也很容易以这种方式将块弄乱。
- @格雷罗哦,酷。你知道为什么吗?
- @Gewure我在这个世界上已经有一段时间了,但是我的猜测是需要将boolean.false的对象形式分解为布尔原语来评估条件。我不知道这是否仍然适用于最新的IDE或编译器。
这似乎是谷歌内部的笑话。谷歌Chrome任务管理器也提供了这个功能。除了一些工程师觉得有趣之外,它没有任何目的。这本身就是一个目的,如果你愿意的话。
在chrome中,使用shift+esc打开任务管理器。
右击可添加Goats Teleported列。
奇迹。
甚至有一个巨大的铬虫报告说有太多的远程传送的山羊。
下面的chromium源代码片段是从hn注释中窃取的。
1 2 3 4
| int TaskManagerModel::GetGoatsTeleported(int index) const {
int seed = goat_salt_ * (index + 1);
return (seed >> 16) & 255;
} |
- 我没有,你右击哪里?或者用来做什么
- 确保在chrome任务管理器中执行,而不是在系统任务管理器中执行。
- 我想这取决于铬的版本。我的是23.0.1271.64
- @在我刚添加的bug报告中,它显示了一个Windows屏幕截图。
- @auselen您必须右键单击列标题才能看到下拉菜单以添加山羊传送列(至少这是它在OS X上的chrome中的工作方式)。C.LY/KSBD
- 它还显示在OSX-V21.0.1180.90中。
- @格林:谢谢你加了这个。在Linux中,您可以右键单击任何地方。
- WindowsXP+最新的Chrome=它不在那里,在Ubuntu上我看到了。
- 它在OSX上,尽管我必须右键单击列并检查山羊传送的项目。
- 运行Chrome最新版本的Windows7也没有显示。:
- @Xeoncross是的,因为从来没有人在Windows软件中放复活节彩蛋。
- @当你的答案被删除时,它已经有了最新的编辑。我认为这是一个很好的解释,但缺少的是对原始问题的回答:"有人知道应该如何以及何时使用它吗?"
- 内部笑话很可能起源于这里:googleblog.blogspot.be/2010/04/goats-are-baaahk.html
- @pdknsk山羊是那些互相跟随,或者过去不经思考就跟随领头羊的动物,所以在编程界有太多的山羊。这可能是某个人的风格@google所说的。不要不假思索地跟着走。
- 这里是一个bug code.google.com/p/chromium/issues/detail?ID=31482
补充@djechlin答案(顺便说一句,答案很好!),此函数调用也可以用作伪代码,在您希望在某个特定迭代或特定递归调用中停止时在IDE中保留断点,例如:
可以使用isUserAGoat()来代替将在IDE中显示为警告的虚拟变量声明,在Eclipse的特定情况下,它将阻塞断点标记,使其难以启用/禁用。如果将该方法用作约定,则所有调用稍后都可以通过某些脚本进行筛选(在提交阶段,可能是吗?).
Google的家伙是Eclipse的重用户(他们以Eclipse插件的形式提供了几个项目:android sdk、gae等),所以@djechlin答案和这个补充答案非常有意义(至少对我来说)。
- 如果编写"虚拟"代码只是为了快速测试,那么Eclipse警告有什么问题??我认为这真的很好,因为你可以找到它,以防你忘了。
- @tomasz的问题是,在Eclipse中,警告标记会阻塞断点,您必须打开断点视图来停用或删除它。
- 是的,我有一个解决办法。您可以右键单击警告符号并选择"切换断点"。如果启用了以下行/选项,则表示创建了断点。我的观点是,伪代码是坏的,它应该是一个警告,所以你不要忘记;)
- @tomasz该解决方案的问题在于,您事先知道断点在哪里,因此简单的目视检查不会让您知道警告隐藏了断点,但更好的解决方案是使用条件断点,使用这些断点,您可以完全忘记伪代码(和约定方法),但这些方法不同。无法在工作站之间自动共享
- 为什么不使用空语句;?我的意思是,山羊显然更好,但有一个简单的方法可以解决这个问题
- 警告可能是由于声明了伪变量而没有使用,使语句成为死区。
- 嘿,这不是白白叫日食!我建议更改Eclipse设置,以便在断点旁边有一条垂直线。这样,您可以在切换它们时看到它们是打开还是关闭。
在每个版本的Android中都有一个有趣的命名方法/常量/随便什么。
我所看到的唯一实际用途是在上一次Google I/O竞赛中,他们问特定版本是什么,看看参赛者是否阅读了每个版本的API Diff报告。比赛也有程序问题,但一般来说,一些琐事可以自动评分,首先得到的提交数量下降到合理的数额,将更容易检查。
- "在每个版本的Android中都有一个有趣的命名方法/常量/任何东西。"你能说出一些吗?
- 例如,有一个称为log.wtf的日志级别,他们称之为"多么可怕的失败":p
- 有点像德尔福的电子病历找不到?stackoverflow.com/questions/2084120/&hellip;
- Honeycomb是adapterview动画师fyiwillbeaadvancedbyhostkthx()。
- @汉内斯,在重力传感器常数中,有一个是死星(星球大战)
- 1.5中有一种"三阶"传感器类型。
- @这一个实际上是有用的,而不是一个复活节彩蛋。我经常用它来处理那些破坏功能但不应该发生的错误(例如,如果抛出异常,我会用以前的检查来防止)。这比忽略错误要好得多。
在语音识别领域,用户分为山羊和绵羊。
例如,在第89页:
Sheeps are people for whom speech recognition works exceptionally well, and goats are people for whom it works exceptionally poorly. Only the voice recognizer knows what separates them. People can't predict whose voice will be recognized easily and whose won't. The best policy is to design the interface so it can handle all kinds of voices in all kinds of environments
也许,它计划在未来将Android用户标记为山羊,以便能够根据山羊的需要配置语音识别引擎。;-)
谷歌非常喜欢山羊和山羊复活节彩蛋。甚至以前也有过关于它的堆栈溢出文章。
正如在以前的文章中提到的,它也存在于chrome任务管理器中(它在2009年首次出现在Wild中):
1 2 3
| <message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column">
Goats Teleported
</message> |
然后在Windows、Linux和Mac版的Chrome 2010年初)。"传送山羊"的数量实际上是随机的:
1 2 3 4
| int TaskManagerModel::GetGoatsTeleported(int index) const {
int seed = goat_salt_ * (index + 1);
return (seed >> 16) & 255;
} |
谷歌对山羊的其他引用包括:
据我所知,山羊和谷歌最早的关联是在原始的"割草与山羊"博客帖子中。
我们可以安全地假设,它只是一个复活节彩蛋,除了返回false之外,没有任何实际用途。
- 有传言称,IBM在各种内部软件中都有山羊参考资料。
- "山羊割草"的存档链接参考:web.archive.org/web/20100619024942/https://hellip;
从API 21(第一个Android 5.0/Lollipop SDK)开始,这将检测是否安装了Goat模拟器应用程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| /**
* 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)投入生产?来吧。如果这就是代码的外观,那么这种实现更改是您的问题中最小的一个。
- 好吧,根据实际的API文档(用户传送倾向),我认为使用它总是返回false实际上是遵循合同的唯一方法。不过,你提出了一个好观点。
- google play.google.com/store/apps/&hellip;上的Goat模拟器看起来很棒。如果知道做一只山羊能得到什么,那就太好了。
有一个类似的调用,isUserAMonkey(),如果使用monkeyrunner工具,则返回true。sdk的解释和这个解释一样有趣。
1
| public static boolean isUserAMonkey(){} |
Returns true if the user interface is currently being messed with by a monkey.
这是来源。
我希望这是在一个名为something with a goat的新的SDK工具的预期中添加的,并且实际上可以对该工具的存在进行功能测试。
另请参见ActivityManager中的一个类似问题:IsUserMonkey。这意味着什么,它的用途是什么?.
- 我的假设是,如果monkeyUI压力测试工具调用了它,它允许ActivityManager报告,但我从未确认过这一点。
在地球上最偏远的山中,有一种高级的山羊,目前似乎可以使用手机,就像我们人类一样!
泄露画面:youtu.be/yjwzmun7gdq
谷歌肯定发现了这一点,并决定为他们提供支持,以期保持在技术进步的前沿。
- 这称为AppCompat。
- 最佳答案
- 山羊的隐私?有人吗?
有趣的复活节彩蛋。
在Ubuntu版本的Chrome中,在任务管理器(shift+esc)中,右键单击可以添加一个科幻专栏,在意大利语版本中是"Capre Teletrasportate"(传送山羊)。
这里有一个有趣的理论。
这不是一个内部笑话显然,它只是一个山羊模拟器-由咖啡染色工作室制作
如果你安装了山羊模拟器,你就是一只山羊。如果你没有安装,你就不是山羊。
我认为这更像是一个开发人员的个人实验,很可能是一个社会实验,以找到有共同兴趣的人。
请参见以下源代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| /**
* 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");
} |