[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; например).

Я заменил, while if , создав более неясный вариант использования. Я считаю, что вы можете отключить вашу среду IDE, например Eclipse, с таким поведением, но это редактирование составляет 4 года в будущем, и у меня нет среды Eclipse для игры.

Question

Я смотрел новые API, представленные в Android 4.2 . При взгляде на класс UserManager я натолкнулся на следующий метод:

 public boolean isUserAGoat()

Используется для определения того, подлежит ли пользователю этот вызов телепортации.

Возвращает, является ли пользователь, выполняющий этот вызов, козой.

Как и когда это следует использовать?




У Google есть серьезная симпатия к козам и козловым пасхальным яйцам . Там даже были предыдущие сообщения о переполнении стека .

Как уже упоминалось в предыдущих сообщениях, он также существует в диспетчере задач Chrome ( он впервые появился в дикой природе в 2009 году ):

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

А затем в Windows, Linux и Mac версии Chrome в начале 2010 года ). Количество «козлов с телепортами» на самом деле случайное :

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

Другие ссылки Google на коз включают:

Насколько мне известно, самое раннее соотношение коз и 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");
}

Это должно дать понять, что предложение джехлина использовать его в качестве бесплатного предупреждения if (false) является потенциально катастрофической стратегией. То, что ранее возвращалось false для каждого устройства, теперь возвращает кажущееся случайное значение: если это было достаточно глубоко закодировано в коде, может потребоваться много времени, чтобы выяснить, откуда берутся ваши новые ошибки.

Итог: если вы не контролируете реализацию метода и не решили использовать его в целях, отличных от указанных в документации API, вы столкнулись с проблемами.




Дополняя answer @djechlin (хороший ответ, кстати!), Этот вызов функции можно также использовать в качестве фиктивного кода для хранения контрольной точки в среде IDE, когда вы хотите остановиться на какой-либо конкретной итерации или на конкретном рекурсивном вызове, например:

isUserAGoat() может использоваться вместо объявления фиктивной переменной, которое будет отображаться в среде IDE в качестве предупреждения, а в частном случае Eclipse будет забивать метку точки останова, что затрудняет ее включение / отключение. Если метод используется в качестве условного обозначения, все вызовы могут быть позже отфильтрованы с помощью какого-либо скрипта (возможно, на этапе фиксации?).

Ребята из Google - это тяжелые пользователи Eclipse (они предоставляют несколько своих проектов как плагины Eclipse: Android SDK, GAE и т. Д.), Поэтому ответ @djechlin и этот дополнительный ответ имеют большой смысл (по крайней мере для меня).




В самых отдаленных горах планеты находится продвинутый вид козы, который, по-видимому, в настоящее время способен использовать телефоны, как и мы, люди!

Просочившийся материал: youtu.be/YJwZMUn7GdQ

Google, должно быть, заметил это и решил оказать им поддержку, пытаясь остаться на переднем крае технологического развития.




Related