Что-то не так с использованием частных классов в моем сервлете Java? - PullRequest
0 голосов
/ 14 сентября 2010

У меня есть сервлет, который выглядит примерно так:

public class MyServlet extends Servlet {

  private class Page {

    private Page(HttpServletRequest request, HttpServletResponse response) {
      /* Do stuff */
    }
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) {

    Page page = new Page(request, response);

    /* Do other stuff */
  }

}

У меня также есть кэш, который выглядит примерно так:

public class Cache {

  private Hashtable<String, CacheValue>;

  public Cache() {
    Hashtable<String, CacheValue> table = new Hashtable()<String, CacheValue>;
  }

  public void put(String key, String value) {
    table.put(key, new CacheValue(value));
  }

  private class CacheValue {

    private value;

    private CacheValue(String value) {
      this.value = value;
    }
  }
}

Мой вопрос такой: есть ли что-то плохое в использовании закрытых вложенных классов таким образом? Я знаю, что у вас обычно есть отдельный публичный класс в отдельном файле, но CacheValue используется только Cache. Page используется только MyServlet. Организовывать занятия таким образом имеет смысл для меня, но я не старый профессионал в Java, поэтому мне интересны плюсы и минусы.

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

Ответы [ 3 ]

3 голосов
/ 14 сентября 2010

Нет, нет ничего плохого в том, чтобы держать вещи в секрете.

Когда код менее доступен, от него зависит меньше вещей, и это дает вам больше свободы для внесения изменений.

Однако вы должны объявить свои CacheValue и Page классы static, поскольку они не имеют доступа ни к каким членам включающего экземпляра.

2 голосов
/ 14 сентября 2010

Мой вопрос такой: есть ли что-то не так с использованием закрытых внутренних классов таким образом?Я знаю, что у вас обычно есть отдельный открытый класс в отдельном файле, но CacheValue всегда используется только Cache.

Ничего плохого в этом нет.Класс Page является частным вложенным классом.По определению вложенные классы находятся в том же файле, что и их классы.

Это нормально, как правило, в контексте сервлета.Если бы были проблемы с (например) видимостью частного класса или его членов, то компилятор сообщит вам.

EDIT

Использует вложенныйклассы вообще считаются делом стиля?Или предпочтения?

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

Или что-то, чего следует избегать?

Нет.

Или инструмент для уменьшения сложности?

Да ... вроде.Я склонен рассматривать вложенные классы (и особенно частные вложенные классы) как механизм модульности.Это не уменьшает сложность в смысле «цикломатической сложности», но, безусловно, помогает скрыть / закрыть детали реализации.

0 голосов
/ 14 сентября 2010

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

...