[Java] Angemessene Anwendungsfälle für Android UserManager.isUserAGoat ()?



Answers

Ich weiß nicht, ob dies der "offizielle" Anwendungsfall war, aber Folgendes erzeugt eine Warnung in Java (die außerdem Kompilierungsfehler erzeugen kann, wenn sie mit return Anweisungen gemischt werden, die zu nicht erreichbarem Code führen):

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

Dies ist jedoch legal:

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

So finde ich mich oft schreibe eine alberne Utility-Methode für den schnellsten Weg, um einen Code-Block zu dummy, dann im Debugging finden Sie alle Anrufe zu ihm, so vorausgesetzt, dass die Implementierung nicht ändert dies kann dafür verwendet werden.

JLS weist darauf hin, if (false) nicht "unerreichbaren Code" auslöst, weil dies die Unterstützung für Debug-Flags, dh im Grunde genommen für diesen Anwendungsfall (h / t @ auszulonen), nicht mehr unterstützt. ( static final boolean DEBUG = false; zum Beispiel).

Ich ersetzte, while für, if ich einen eher obskuren Anwendungsfall produziere. Ich glaube, dass Sie mit diesem Verhalten Ihre IDE wie Eclipse stolpern können, aber diese Bearbeitung ist 4 Jahre in die Zukunft und ich habe keine Eclipse-Umgebung zum Spielen.

Question

Ich habe mir die neuen APIs von Android 4.2 angeschaut . Beim Betrachten der UserManager Klasse bin ich auf folgende Methode UserManager :

 public boolean isUserAGoat()

Wird verwendet, um zu bestimmen, ob der Benutzer, der diesen Anruf tätigt, teleportiert wird.

Gibt zurück, ob der Benutzer, der diesen Aufruf ausführt, eine Ziege ist.

Wie und wann sollte dies verwendet werden?




Google mag Ostereier auf Ziegen- und Ziegenbasis sehr gern. Es gab sogar vorherige Posts darüber .

Wie bereits in früheren Beiträgen erwähnt, gibt es sie auch im Chrome-Aufgabenmanager ( er erschien erstmals 2009 in der Wildnis ):

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

Und dann in Windows, Linux und Mac-Versionen von Chrome Anfang 2010 ). Die Anzahl der "Teleportierten Ziegen" ist tatsächlich zufällig :

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

Andere Google-Verweise auf Ziegen umfassen:

Die früheste Übereinstimmung von Ziegen und Google gehört, soweit ich das beurteilen kann, zum ursprünglichen Blogeintrag "Mähen mit Ziegen".

Wir können davon ausgehen, dass es nur ein Osterei ist und keinen realen Gebrauch hat, außer dass es false zurückkehrt.




Neben der @djechlin- answer (gute Antwort übrigens!) Könnte dieser Funktionsaufruf auch als Dummy-Code verwendet werden, um einen Haltepunkt in einer IDE zu halten, wenn Sie in einer bestimmten Iteration oder einem bestimmten rekursiven Aufruf anhalten möchten, zum Beispiel:

isUserAGoat() könnte anstelle einer Dummy-Variablendeklaration verwendet werden, die in der IDE als Warnung angezeigt wird und im speziellen Eclipse-Fall die Haltepunktmarke verstopft, was es schwierig macht, sie zu aktivieren / deaktivieren. Wenn die Methode als Konvention verwendet wird, könnten alle Aufrufe später durch ein Skript gefiltert werden (während der Festschreibungsphase vielleicht?).

Google-Leute sind starke Eclipse-Benutzer (sie stellen einige ihrer Projekte als Eclipse-Plugins zur Verfügung: Android SDK, GAE, usw.), so dass die @ djechlin-Antwort und diese ergänzende Antwort (zumindest für mich) sehr sinnvoll sind.




Ab API 21 (das erste Android 5.0 / Lollipop SDK) erkennt dies, ob die Goat Simulator App installiert ist:

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

Dies sollte deutlich machen, dass der Vorschlag von Djechlin , ihn als warnenfrei zu verwenden, if (false) eine potenziell katastrophale Strategie ist. Was zuvor für jedes Gerät false , gibt nun einen scheinbar zufälligen Wert zurück: Wenn dieser Code tief genug in Ihrem Code verborgen war, kann es lange dauern, bis Sie herausgefunden haben, woher Ihre neuen Fehler kommen.

Fazit: Wenn Sie die Implementierung einer Methode nicht kontrollieren und sich dafür entscheiden, sie für andere Zwecke als die in der API-Dokumentation angegebenen zu verwenden, sind Sie auf der Suche nach Problemen.




In den entlegensten Bergen des Planeten liegt eine fortschrittliche Ziege, die augenblicklich in der Lage ist, Telefone zu benutzen, genau wie wir Menschen!

Durchgesickertes Material: youtu.be/YJwZMUn7GdQ

Google muss dies erkannt haben und entschied sich, sie zu unterstützen, um an vorderster Front des technologischen Fortschritts zu bleiben.




Links