Анонимный класс определен в интерфейсе VS.Конкретный класс вне интерфейса - PullRequest
0 голосов
/ 27 февраля 2019

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

В этом случае я обычно делаю конкретный класс интерфейса в другом Java-файле какниже.

public interface MyStrategy {
    void doSomething();
}

public class DefaultMyStrategy implements MyStrategy {
    @Override 
    public void doSomething() {
    }
}

Но недавно я увидел некоторый код, который содержит анонимный класс в интерфейсе, и он выглядит следующим образом.

public interface MyStrategy {

    MyStrategy DEFAULT = new MyStrategy() {
        @Override 
        public void doSomething() {
        }
    };

    void doSomething();
}

Какой из них лучше сделать по умолчаниюкласс?

На мой взгляд, MyStrategy strategy = MyStrategy.DEFAULT; лучше, чем MyStrategy strategy = new DefaultMyStrategy();.

Однако мне интересно, широко ли используется второй.

1 Ответ

0 голосов
/ 27 февраля 2019

Это действительно зависит от ваших вариантов использования.Во втором случае вы получите поведение ниже.

  1. По умолчанию MyStrategy DEFAULT будет public static final.Это означает, что вы не можете reinitialize это в любой момент времени.

  2. same reference будет предоставлен для общего доступа там, где вы используете MyStrategy.DEFAULT.Если объект mutable, а вы mutating, то вы можете столкнуться с некоторой проблемой.

  3. Объект будет создан при первом использовании, когда будет not be eligible for GC до загрузчика классоввыгружает класс.

Но в случае MyStrategy strategy = new DefaultMyStrategy(); вы будете получать новый экземпляр каждый раз, когда используете new DefaultMyStrategy();.

Теперь случай использования в вашей руке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...