Android 4.2で導入された新しいAPIを見ていました。UserManager
クラスを見ていると、次のメソッドに遭遇しました:
public boolean 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");
}
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");
}
したがって、コードブロックをダミーにする最も迅速な方法として、ばかげたユーティリティメソッドを作成していることがよくあります。次に、デバッグを完了するときに、その呼び出しをすべて見つけます。これにより、実装が変更されない限り、これを使用できます。
JLSif (false)
は、これがデバッグフラグのサポートを無効にする特定の理由、つまり基本的にこの使用例(h / t @auselen)のために「到達不能コード」をトリガーしないことを指摘しています。(static final boolean DEBUG = false;
例えば)。
の代わりwhile
にif
使用して、よりあいまいなユースケースを作成しました。私はあなたがEclipseのようにあなたのIDEをこの振る舞いでつまずくことができると信じていますが、この編集は4年後のことであり、私はEclipse環境で遊ぶことができません。
else
など、ブロック
isUserAGoat()
。ユーザーが特定のアプリをインストールしている場合、API21以降はtrueを返します。コードが突然「ランダムな」デバイスで奇妙な動作を開始したときに診断してください。
これはGoogleの冗談のようです。また、Google Chromeタスクマネージャーでも紹介されています。面白いと思うエンジニアがいること以外、目的はありません。もしそうなら、それはそれ自体が目的です。
Goats Teleported
列を追加し ます。テレポートされた山羊が多すぎるという巨大なChromiumバグレポートさえあります。
次のChromium ソースコードスニペットは、HNコメントから盗まれています。
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 / whateverという面白い名前が付いています。
私が今まで見た唯一の実用的な用途は、Google I / Oコンテストのラストコールで、特定のバージョンの内容を尋ねて、各リリースのAPI差分レポートを読むかどうかを確認しました。コンテストにもプログラミングの問題がありましたが、一般的に、最初に自動的に採点して、提出物の数を確認しやすい合理的な量に減らすことができるいくつかの雑学。
Googleは、山羊と山羊ベースのイースターエッグを真剣に好みます。それに関する以前のスタックオーバーフローの投稿もありました。
以前の投稿で述べたように、Chromeタスクマネージャー内にも存在します(2009年に最初に登場しました)。
<message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column">
Goats Teleported
</message>
そして、Windows、Linux、およびChromeのMacバージョンでは2010年初頭)。「テレポートされた山羊」の数は実際にはランダムです:
int TaskManagerModel::GetGoatsTeleported(int index) const {
int seed = goat_salt_ * (index + 1);
return (seed >> 16) & 255;
}
ヤギへの他のGoogleの言及は次のとおりです。
山羊とグーグルの最も初期の相関関係は、私が知る限り、元の「山羊と草刈り」のブログ投稿に属しています。
これは単にイースターエッグであり、戻る以外は実際には使用されていないと想定しても問題ありません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
ですが、これを確認したことはありません。
それは内部の冗談ではありません
どうやら、それは山羊シミュレータのための単なるアプリケーションチェッカーです -Coffee Stain Studiosによる
Goat Simulatorがインストールされていれば、あなたはヤギです。インストールしていない場合は、ヤギではありません。
それは、開発者の一人による個人的な実験であり、共通の関心を持つ人々を見つける可能性が最も高いと思います。