Java: когда использовать статические методы

Спустя пару лет наткнулся на эту тему. В 2016 году большинство устройств Android будут иметь уровень API> = 18 и поэтому должны полагаться на Location.isFromMockProvider (), как указано Fernando .

Я интенсивно экспериментировал с фальшивым / макетным местоположения на разных устройствах и дистрибутивах Android. К сожалению .isFromMockProvider () не на 100% надежнее. Время от времени подделка не будет помечена как макет . Похоже, что это связано с некоторой ошибочной логикой внутреннего слияния в Google Location API.

Я написал подробное сообщение в блоге об этом , если вы хотите узнать больше. Подводя итог, если вы подписаны на обновления местоположения из API местоположения, затем включите поддельное приложение GPS и распечатайте результат каждой команды Location.toString () на консоли, вы увидите что-то вроде этого:

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

Чтобы исправить эту проблему, я написал класс утилиты, который будет надежно подавлять местоположения Mock во всех современных версиях Android (уровень API 15 и выше):

LocationAssistant - бесплатные обновления местоположения на Android

В принципе, он «недоверяет» немощные местоположения, которые находятся в пределах 1 км от последнего известного макетного местоположения, а также называет их как макет. Он делает это до тех пор, пока не достигнет значительного количества немощных мест. LocationAssistant может не только отбрасывать ложные местоположения, но и освобождает вас от большинства проблем с настройкой и подпиской на обновления местоположения.

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

public class MyActivity extends Activity implements LocationAssistant.Listener {

    private LocationAssistant assistant;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        // You can specify a different accuracy and interval here.
        // The last parameter (allowMockLocations) must be 'false' to suppress mock locations.  
        assistant = new LocationAssistant(this, this, LocationAssistant.Accuracy.HIGH, 5000, false);
    }

    @Override
    protected void onResume() {
        super.onResume();
        assistant.start();
    }

    @Override
    protected void onPause() {
        assistant.stop();
        super.onPause();
    }

    @Override
    public void onNewLocationAvailable(Location location) {
        // No mock locations arriving here
    }

    ...
}

onNewLocationAvailable() теперь будет вызываться только с информацией о реальном местоположении. Есть еще несколько методов слушателя, которые вам нужно реализовать, но в контексте вашего вопроса (как предотвратить спуфинг с GPS) это в основном это.

Конечно, с корневой ОС вы все равно можете найти способы информация о спуфинге, которую невозможно обнаружить обычным приложениям.

841
задан Community 5 April 2016 в 03:49
поделиться

8 ответов

Одно практическое правило: спросите сами "имеет ли смысл вызывать этот метод, даже если объект Obj еще не создан?" Если да, то он определенно должен быть статичным.

Итак, в классе Автомобиль у вас может быть метод double convertMpgToKpl (double mpg) , который будет статическим, потому что кто-то может захотеть узнать, во что конвертируется 35 миль на галлон, даже если никто когда-либо строил Автомобиль. Но void setMistance (double mpg) (который устанавливает эффективность одного конкретного автомобиля) не может быть статическим, поскольку немыслимо вызвать метод до того, как какой-либо автомобиль будет построен.

(Кстати, обратное не всегда верно: иногда у вас может быть метод, который включает два объекта Car , но при этом он должен быть статическим. Например, Car theMoreEfficientOf (Car c1, Car c2) . Хотя это может быть преобразовано в нестатическую версию, некоторые будут утверждать, что, поскольку нет «привилегированного» выбора, какой автомобиль более важен, вы не должны заставлять вызывающего абонента выбирать один Car как объект, для которого вы вызовете метод, однако на эту ситуацию приходится довольно небольшая часть всех статических методов.)

1393
ответ дан 22 November 2019 в 21:08
поделиться

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

Вы должны использовать статический метод, если метод не использует какие-либо поля (или только статические поля) класса.

Если используются какие-либо нестатические поля класса, вы должны использовать нестатический метод.

8
ответ дан 22 November 2019 в 21:08
поделиться

Прочитав статьи Миско, я считаю, что статические методы плохи с точки зрения тестирования. Вместо этого у вас должны быть фабрики (возможно, с помощью инструмента внедрения зависимостей, такого как Guice ).

как мне убедиться, что у меня есть только одно из чего-то

есть только одно из чего-то Проблема «как мне убедиться, что у меня есть только одно из чего-то», прекрасно отступил. Вы создаете экземпляр только одного ApplicationFactory в своем главном элементе, и в результате вы создаете только один экземпляр всех ваших синглтонов.

Основная проблема статических методов заключается в том, что они представляют собой процедурный код.

Основная проблема со статическими методами заключается в том, что они представляют собой процедурный код. Я понятия не имею, как проводить модульное тестирование процедурного кода. Модульное тестирование предполагает, что я могу создать экземпляр своего приложения изолированно. Во время создания экземпляра я связываю зависимости с mocks / friendlylies, которые заменяют реальные зависимости. При процедурном программировании нечего "связывать" , поскольку нет объектов, код и данные разделены.

40
ответ дан 22 November 2019 в 21:08
поделиться

Статические методы не нужно вызывать для объекта, и именно тогда вы его используете. Пример: ваш Main () является статическим, и вы не создаете объект для его вызова.

4
ответ дан 22 November 2019 в 21:08
поделиться

Используйте статический метод, если вы хотите иметь доступ к методу без экземпляра класса.

5
ответ дан 22 November 2019 в 21:08
поделиться

Нет, статические методы не связаны с экземпляром; они принадлежат к классу. Статические методы - ваш второй пример; методы экземпляра являются первыми.

11
ответ дан 22 November 2019 в 21:08
поделиться

Статические методы в java принадлежат классу (а не его экземпляру). Они не используют переменные экземпляра и обычно принимают входные данные из параметров, выполняют с ними действия, а затем возвращают некоторый результат. Методы экземпляров связаны с объектами и, как следует из названия, могут использовать переменные экземпляра.

18
ответ дан 22 November 2019 в 21:08
поделиться

Статический: Obj.someMethod

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

3
ответ дан 22 November 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: