[Java] Cas d'utilisation appropriés pour Android UserManager.isUserAGoat ()?



Answers

Je ne sais pas si c'était "le" cas d'utilisation officiel, mais ce qui suit produit un avertissement en Java (qui peut encore produire des erreurs de compilation si mélangé avec des instructions de return , conduisant à un code inaccessible):

while (1 == 2) { // Note that "if" is treated differently
    System.out.println("Unreachable code");
}

Cependant c'est légal:

while (isUserAGoat()) {
    System.out.println("Unreachable but determined at runtime, not at compile time");
}

Je me retrouve donc souvent à écrire une méthode utilitaire idiote pour trouver un bloc de code le plus rapidement possible, puis, en finalisant le débogage, trouver tous les appels, donc à condition que l'implémentation ne change pas cela peut être utilisé pour cela.

JLS indique if (false) ne déclenche pas de "code inaccessible" pour la raison spécifique que cela annulerait le support pour les drapeaux de débogage, c'est-à-dire, fondamentalement, ce cas d'utilisation (h / t @auselen). ( static final boolean DEBUG = false; par exemple).

J'ai remplacé while que if , produisant un cas d'utilisation plus obscur. Je crois que vous pouvez trébucher votre EDI, comme Eclipse, avec ce comportement, mais cette édition aura lieu dans 4 ans et je n'ai pas d'environnement Eclipse avec lequel jouer.

Question

Je regardais les nouvelles API introduites dans Android 4.2 . En regardant la classe UserManager , je suis tombé sur la méthode suivante:

 public boolean isUserAGoat()

Permet de déterminer si l'utilisateur effectuant cet appel est sujet à des téléportations.

Renvoie si l'utilisateur effectuant cet appel est une chèvre.

Comment et quand cela devrait-il être utilisé?




En complément de la answer @djechlin (bonne réponse au passage!), Cet appel de fonction pourrait également être utilisé comme code fictif pour contenir un point d'arrêt dans un EDI lorsque vous souhaitez arrêter une itération spécifique ou un appel récursif particulier, par exemple:

isUserAGoat() peut être utilisé à la place d'une déclaration de variable fictive qui sera affichée dans l'EDI comme un avertissement et, dans le cas particulier d'Eclipse, obstruera la marque du point d'arrêt, rendant difficile son activation / désactivation. Si la méthode est utilisée comme une convention, toutes les invocations pourraient être filtrées plus tard par un script (pendant la phase de validation peut-être?).

Les gars de Google sont de gros utilisateurs Eclipse (ils fournissent plusieurs de leurs projets en tant que plugins Eclipse: Android SDK, GAE, etc), donc la réponse @djechlin et cette réponse complémentaire ont beaucoup de sens (du moins pour moi).




Google a un goût prononcé pour les oeufs de Pâques à base de chèvres et de chèvres. Il y a même eu des posts sur à ce sujet .

Comme cela a été mentionné dans les publications précédentes, il existe également dans le gestionnaire de tâches Chrome ( il est apparu dans la nature en 2009 ):

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

Et puis dans les versions Windows, Linux et Mac de Chrome début 2010 ). Le nombre de "Goats téléportés" est en fait aléatoire :

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

D'autres références Google aux chèvres incluent:

La première corrélation de chèvres et de Google appartient à l'article original "Mowing with goats", pour autant que je sache.

Nous pouvons sans risque supposer que c'est simplement un oeuf de pâques et n'a aucune utilisation réelle, sauf pour retourner false .




À partir de l'API 21 (le premier SDK Android 5.0 / Lollipop) , cela détecte si l'application Goat Simulator est installée:

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

Cela devrait indiquer clairement que la suggestion de djechlin de l'utiliser comme un avertissement sans if (false) est une stratégie potentiellement désastreuse. Ce qui précédemment renvoyé false pour chaque périphérique renvoie maintenant une valeur apparemment aléatoire: si cela a été enterré assez profondément dans votre code, il pourrait prendre beaucoup de temps pour comprendre d'où viennent vos nouveaux bugs.

Bottom line: si vous ne contrôlez pas l'implémentation d'une méthode et décidez de l'utiliser à d'autres fins que celles indiquées dans la documentation de l'API, vous vous dirigez vers des problèmes.




Dans les montagnes les plus reculées de la planète, se trouve une espèce de chèvre avancée qui semble actuellement capable d'utiliser des téléphones, tout comme nous les humains!

Vidéos diffusées: youtu.be/YJwZMUn7GdQ

Google a dû repérer cela et a décidé de fournir un soutien pour eux, dans une tentative de rester en première ligne de l'avancement de la technologie.




Links