Estaba mirando las nuevas API introducidas en Android 4.2 . Mientras miraba la UserManagerclase me encontré con el siguiente método:

public boolean isUserAGoat()

Used to determine whether the user making this call is subject to teleportations.

Returns whether the user making this call is a goat.

¿Cómo y cuándo se debe usar esto?

respuesta

Actualización de Android R:

Desde Android R, este método siempre devuelve false. Google dice que esto se hace "para proteger la privacidad de las cabras":

/**
 * 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>
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#R}, this method always returns
 * {@code false} in order to protect goat privacy.</p>
 *
 * @return Returns whether the user making this call is a goat.
 */
public boolean isUserAGoat() {
    if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.R) {
        return false;
    }
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Respuesta anterior:

Desde su fuente , el método utilizado para regresar falsehasta que se cambió en 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;
}

Parece que el método no tiene ningún uso real para nosotros como desarrolladores. Alguien ha dicho previamente que podría ser un huevo de Pascua .

En API 21 se cambió la implementación para verificar si hay una aplicación instalada con el paquetecom.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");
}

Aquí está la fuente y el cambio .

No sé si este fue "el" caso de uso oficial, pero lo siguiente produce una advertencia en Java (que puede producir errores de compilación si se mezcla con returndeclaraciones, lo que lleva a un código inalcanzable):

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

Sin embargo, esto es legal:

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

Por lo tanto, a menudo me encuentro escribiendo un método de utilidad tonto para encontrar la forma más rápida de eliminar un bloque de código, luego, al completar la depuración, encuentro todas las llamadas, por lo que siempre que la implementación no cambie, esto se puede usar para eso.

JLS señala if (false)que no activa el "código inalcanzable" por la razón específica de que esto rompería el soporte para los indicadores de depuración, es decir, básicamente este caso de uso (h/t @auselen). ( static final boolean DEBUG = false;por ejemplo).

Reemplacé whilepor if, produciendo un caso de uso más oscuro. Creo que puede tropezar con su IDE, como Eclipse, con este comportamiento, pero esta edición es de 4 años en el futuro y no tengo un entorno de Eclipse para jugar.

Esto parece ser una broma interna en Google. También aparece en el administrador de tareas de Google Chrome. No tiene ningún propósito, aparte de que algunos ingenieros lo encuentren divertido. Lo cual es un propósito en sí mismo, por así decirlo.

  1. En Chrome, abra el Administrador de tareas con Shift+ Esc.
  2. Haga clic derecho para agregar la Goats Teleportedcolumna.
  3. Preguntarse.

Incluso hay un gran informe de error de Chromium sobre demasiadas cabras teletransportadas .

cromo

El siguiente fragmento de código fuente de Chromium fue robado de los comentarios de HN .

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

Complementando la respuesta de @djechlin (¡buena respuesta por cierto!), esta llamada de función también podría usarse como código ficticio para mantener un punto de interrupción en un IDE cuando desee detenerse en alguna iteración específica o una llamada recursiva particular, por ejemplo:

ingrese la descripción de la imagen aquí

isUserAGoat()podría usarse en lugar de una declaración de variable ficticia que se mostrará en el IDE como una advertencia y, en el caso particular de Eclipse, obstruirá la marca del punto de interrupción, lo que dificultará su activación/desactivación. Si el método se usa como una convención, todas las invocaciones podrían filtrarse más tarde mediante algún script (¿durante la fase de confirmación, tal vez?).

ingrese la descripción de la imagen aquí

Los muchachos de Google son grandes usuarios de Eclipse (proporcionan varios de sus proyectos como complementos de Eclipse: SDK de Android, GAE, etc.), por lo que la respuesta de @djechlin y esta respuesta complementaria tienen mucho sentido (al menos para mí).

Hay un método/constante/lo que sea con un nombre divertido en cada versión de Android.

El único uso práctico que vi fue en el concurso Last Call for Google I/O donde preguntaron qué era para una versión en particular, para ver si los concursantes leían el informe de diferencia de API para cada versión. El concurso también tuvo problemas de programación, pero en general algunas trivialidades que podrían calificarse automáticamente primero para reducir el número de presentaciones a cantidades razonables que serían más fáciles de verificar.

En la disciplina del reconocimiento de voz, los usuarios se dividen en cabras y ovejas .

Por ejemplo, aquí en la página 89 :

Sheeps are people for whom speech recognition works exceptionally well, and goats are people for whom it works exceptionally poorly. Only the voice recognizer knows what separates them. People can't predict whose voice will be recognized easily and whose won't. The best policy is to design the interface so it can handle all kinds of voices in all kinds of environments

Tal vez, se planee marcar a los usuarios de Android como cabras en el futuro para poder configurar el motor de reconocimiento de voz para las necesidades de las cabras. ;-)

A partir de API 21 (el primer SDK de Android 5.0/Lollipop) , esto detecta si la aplicación Goat Simulator está instalada:

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

Esto debería dejar en claro que la sugerencia de djechlin de usarlo como una advertencia if (false)es una estrategia potencialmente desastrosa. Lo que antes devolvía falsepara cada dispositivo ahora devuelve un valor aparentemente aleatorio: si esto estaba lo suficientemente enterrado en su código, podría llevar mucho tiempo descubrir de dónde provienen sus nuevos errores.

En pocas palabras: si no controla la implementación de un método y decide usarlo para fines distintos a los establecidos en la documentación de la API, se encontrará con problemas.

Google tiene un gran gusto por las cabras y los huevos de Pascua basados ​​en cabras . Incluso ha habido publicaciones anteriores de Stack Overflow al respecto .

Como se mencionó en publicaciones anteriores, también existe dentro del administrador de tareas de Chrome ( apareció por primera vez en 2009 ):

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

Y luego en versiones Windows, Linux y Mac de Chrome a principios de 2010 ). El número de "Cabras teletransportadas" es, de hecho, aleatorio :

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

Otras referencias de Google a las cabras incluyen:

La correlación más antigua entre las cabras y Google pertenece a la publicación original del blog "Cortar con cabras", por lo que sé.

Podemos suponer con seguridad que es simplemente un huevo de Pascua y no tiene ningún uso en el mundo real, excepto para devolver false.

Existe una llamada similar, isUserAMonkey(), que devuelve verdadero si se utiliza la herramienta MonkeyRunner . La explicación del SDK es tan curiosa como esta.

public static boolean isUserAMonkey(){}     

Returns true if the user interface is currently being messed with by a monkey.

Aquí está la fuente.

Espero que esto se haya agregado en previsión de una nueva herramienta SDK llamada algo con una cabra y que en realidad sea funcional para probar la presencia de esa herramienta.

También vea una pregunta similar, Función extraña en ActivityManager: isUserAMonkey. ¿Qué significa esto, cuál es su uso? .

Huevo de Pascua divertido.
En la versión de Ubuntu de Chrome, en el Administrador de tareas ( shift+ esc), con un clic derecho puedes agregar una columna de ciencia ficción que en la versión italiana es "Capre Teletrasportate" (Cabras teletransportadas).

Una teoría divertida al respecto está aquí .

No es una broma interna

Aparentemente es solo un verificador de aplicaciones para Goat Simulator - por Coffee Stain Studios

Si tienes instalado Goat Simulator, eres una cabra. Si no lo tienes instalado, no eres una cabra.

Me imagino que fue más un experimento personal de uno de los desarrolladores, probablemente para encontrar personas con un interés común.