提问



我正在研究Android 4.2中引入的新API。
在查看UserManager课程时,我遇到了以下方法:[26] [27]


 public boolean isUserAGoat()



  用于确定进行此呼叫的用户是否受传送的影响。

  
  返回进行此调用的用户是否为山羊。



应该如何以及何时使用?

最佳参考


从他们的来源,用于返回false直到在API 21中更改的方法。[28]


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


看起来这个方法作为开发人员对我们没有实际用处。之前有人说它可能是复活节彩蛋[29]


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


这是源链接 [30]

其它参考1


我不知道这是否是官方用例,但以下内容会在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;)。[31]


我将while替换为if,产生了一个更加模糊的用例。我相信你可以通过这种行为来引导你的IDE,比如Eclipse,但是这个编辑将在未来4年内完成,而且我没有Eclipse环境可以使用。

其它参考2


这似乎是谷歌内心的笑话。它也是谷歌Chrome任务管理器中的特色。它没有任何意义,除了一些工程师发现它很有趣。如果你愿意的话,这本身就是一个目的。



  1. 在Chrome中,使用 Shift + Esc 打开任务管理器。

  2. 右键单击以添加Goats Teleported列。

  3. 奇迹。



关于太多传送的山羊,甚至有一个巨大的Chromium bug报告。[32]





HN评论中隐藏了以下Chromium源代码段。[33] [34]


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

其它参考3


补充@djechlin答案(顺便说一下好的答案!),当你​​想在某个特定的迭代或特定的迭代中停止时,这个函数调用可以用作伪代码来保存IDE中的断点。递归调用,例如:





可以使用isUserAGoat()代替虚拟变量声明,它将在IDE中显示为警告,并且在Eclipse特定情况下,将阻塞断点标记,从而难以启用/禁用它。如果该方法用作约定,则稍后可以通过某些脚本过滤所有调用(在提交阶段可能?)。





谷歌人是沉重的Eclipse用户(他们提供了几个项目作为Eclipse插件:Android SDK,GAE等),所以@djechlin答案和这个补充答案很有意义(至少对我而言)。

其它参考4


在每个版本的Android中都有一个有趣的命名方法/常量/任何东西。


我见过的唯一实际用途是在Google I/O竞赛的最后召唤中,他们询问特定版本的内容,看看参赛者是否阅读了每个版本的API差异报告。比赛也存在编程问题,但通常会有一些琐事可以先自动评分,以便将提交的数量降低到更容易检查的合理数量。[36]

其它参考5


在语音识别学科中,用户分为山羊和绵羊。


例如,第89页的 :[37]



  绵羊是语音识别非常好的人,山羊是非常糟糕的人。只有语音识别器知道它们之间的区别。人们无法预测谁的声音会被轻易识别,谁的声音就会被识别出来。最好的策略是设计界面,以便它可以处理各种环境中的各种声音



也许,计划在未来将Android用户标记为山羊,以便能够为山羊配置语音识别引擎需要。;-)

其它参考6


谷歌非常喜欢山羊和山羊的复活节彩蛋。甚至还有关于它的Stack  Overflow帖子。 [38]


正如之前的帖子中所提到的,它也存在于Chrome任务管理器中(它于2009年首次出现):[40]


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


然后在2010年初的Windows,Linux和Mac版Chrome中)。 传送山羊的数量实际上是随机的:[41] [42]


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


其他谷歌参考山羊包括:



  • 用山羊割草

  • 山羊是baaaahk



据我所知,山羊和谷歌最早的相关性属于最初的山羊割草博客文章。[43] [44]


我们可以放心地假设它只是一个复活节彩蛋,除了返回false之外没有现实世界的使用。

其它参考7


从API 21(第一个Android 5.0/Lollipop SDK)开始,它会检测是否安装了山猫模拟器应用程序:[45] [46]


/**
 * 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现在返回一个看似随机的值:如果这是在您的代码中埋藏得足够深,可能需要很长的时间来确定新bug的来源。


一句话:如果您不控制方法的实现并决定将其用于API文档中未说明的目的,那么您将面临麻烦。

其它参考8


有一个类似的调用isUserAMonkey(),如果使用MonkeyRunner工具则返回true。 SDK解释和这个一样好奇。 [48]



public static boolean isUserAMonkey(){}     

  
  如果用户界面当前正被猴子搞砸,则返回true



这是来源。 [49]


我希望这是为了预期一个名为山羊的新SDK工具,并且实际可用于测试该工具的存在。 [50]


另请参阅类似的问题, ActivityManager中的奇怪函数:isUserAMonkey。这意味着什么,它的用途是什么?

其它参考9


[52]


在这个星球上最偏远的山脉中,有一种先进的山羊种类,它们似乎能够像我们人类一样使用手机!


泄露的镜头:youtu.be/YJwZMUn7GdQ [53]


[54]


谷歌必须已经发现了这一点,并决定为他们提供支持,试图保持技术进步的前沿。

其它参考10


有趣的复活节彩蛋
在Ubuntu版本的Chrome中,在任务管理器中( shift + esc ),右键单击即可添加意大利语版本为Capre Teletrasportate的科幻列(传送山羊)。


关于它的一个有趣的理论就在这里。[55]