[Java] 適用於Android UserManager.isUserAGoat()的正確用例?



Answers

我不知道這是否是“正式用例”,但是下面的代碼會在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; )。

我替換if ,產生了一個更隱晦的用例。 我相信你可以通過這種行為將你的IDE與Eclipse一起絆倒,但是這種編輯是未來4年,並且我沒有Eclipse環境可以使用。

Question

我正在研究Android 4.2中引入的新API。 在查看UserManager類時,我遇到了以下方法:

 public boolean isUserAGoat()

用於確定發起此呼叫的用戶是否需要遠程傳送。

返回進行此調用的用戶是否是山羊。

如何和何時應該使用?




從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的建議是將其作為無警告的使用。 以前為每個設備返回false的現在返回一個看似隨機的值:如果這個代碼深埋在代碼中,可能需要長時間才能確定新bug是從哪裡來的。

底線:如果您不控制某個方法的實施並決定將其用於API文檔中所述以外的其他目的,那麼您就會遇到麻煩。




作為@djechlin answer補充(順便說一句很好的答案!),這個函數調用也可以用作虛擬代碼,當你想停止某個特定的迭代或特定的遞歸調用時,在IDE中保存一個斷點,例如:

可以使用isUserAGoat()來代替虛擬變量聲明,該聲明將在IDE中顯示為警告,並且在Eclipse特定情況下會阻塞斷點標記,從而難以啟用/禁用它。 如果該方法用作約定,則所有調用都可以稍後通過某個腳本進行過濾(在提交階段過程中可能會?)。

谷歌的用戶是Eclipse用戶(他們提供了幾個Eclipse插件:Android SDK,GAE等),所以@djechlin的答案和這個補充答案很有意義(至少對我而言)。




在這個星球上最偏遠的山區,有一種先進的山羊品種,它似乎目前能夠使用手機,就像我們人類一樣!

洩漏的鏡頭: youtu.be/YJwZMUn7GdQ

谷歌一定已經發現了這一點,並決定為它們提供支持,試圖留在技術進步的前沿。




谷歌非常喜歡山羊和山羊復活節彩蛋 。 甚至有關於它的以前的堆棧溢出帖子

正如前面的帖子中提到的,它也存在於Chrome任務管理器中( 它在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對山羊的引用包括:

據我所知,山羊和谷歌最早的關聯屬於最初的“山羊割草”博客文章。

我們可以有把握地認為這只是一個複活節彩蛋,沒有真實世界的使用,除了返回false




Links