Набор констант должен быть помещен в класс или интерфейс?

Сначала предупреждение: Быть осторожным при использовании FTP, потому что ни аутентификация, ни передача данных не шифруются.

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

$ man vsftpd.conf

Добавляют следующие строки к Вашей vsftpd конфигурации:

chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot.list

Затем добавляют каждого пользователя, которого Вы хотите заблокировать к их homedir в chroot.list файл. Можно изменить пользователей homedir при помощи

$ sudo usermod -d /path/to/homedir user

, я надеюсь, что это помогает.

34
задан DaveJohnston 30 June 2017 в 12:48
поделиться

8 ответов

Если у них сильные связи, я бы поместил их в перечисление:

public enum Error {
  ERROR_1("-1", "foo went wrong"),
  ERROR_2("-2", "bar went wrong");

  private final String id;
  private final String message;

  Error(String id, String message) {
    this.id=id;
    this.message=message;
  }

  public String getId() {
    return id;
  }

  public String getMessage() {
    return message;
  }
}

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

32
ответ дан 27 November 2019 в 16:41
поделиться

Некоторые люди считают постоянный интерфейс анти-шаблоном ( http://en.wikipedia.org/wiki/Constant_interface ).

10
ответ дан 27 November 2019 в 16:41
поделиться

Вы должны делать это в классе.

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

Класс, с другой стороны, представляет собой описание объекта или (если вы не слишком строго придерживаетесь принципов объектно-ориентированного проектирования ...) заполнитель для статических членов. Лично я считаю, что в некоторых проектах очень полезно хранить кучу констант в классе Settings , поэтому мне не нужно смотреть по всему проекту в поисках определений. Думаю, вам тоже нужен этот подход.

6
ответ дан 27 November 2019 в 16:41
поделиться

Это обсуждалось до :

Причина, по которой вам не нужны константы в интерфейсе, заключается в том, что это побуждает клиентские классы «реализовать» этот интерфейс (чтобы получить доступ к константам без добавления к ним имени интерфейса). Однако вам не следует этого делать - интерфейс на самом деле не является интерфейсом к возможностям объекта, а удобством времени компиляции, укоренившимся во внешнем типе класса.

Было время, когда «постоянный интерфейс» был очень удобен , но это всегда было «неправильно», и даже лень не может служить оправданием для его использования сейчас, когда у нас есть операторы import static .

Изменить: Хотя я должен согласиться с тем, что для сценария, представленного в вашем вопросе, более подходят перечисления.

6
ответ дан 27 November 2019 в 16:41
поделиться

Здесь следует рассмотреть использование статического импорта (для импорта констант, определенных в классе) или типобезопасного Enum .

Из Интерфейс для констант

Размещение констант в интерфейсе было популярной техникой на заре Java, но сейчас многие считают это отвратительным использованием интерфейсов, поскольку интерфейсы должны иметь дело со службами, предоставляемыми объект, а не его данные .
Кроме того, константы, используемые классом, обычно являются деталями реализации, но размещение их в интерфейсе продвигает их в общедоступный API класса.

5
ответ дан 27 November 2019 в 16:41
поделиться

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

0
ответ дан 27 November 2019 в 16:41
поделиться

Вы должны поместить их в класс с помощью частного конструктора.

public class ErrorCodes {
    private ErrorCodes() {} // prevents instantiation
    public static final String ERROR_1 = "-1";
    public static final String ERROR_2 = "-2";

}

Или еще лучше, используйте типизированное перечисление.

3
ответ дан 27 November 2019 в 16:41
поделиться

Значение типа имеет формат {Class}, {assembly} .

Таким образом, в вашем случае это должно быть MyHttpModule, MyDllName

Где MyDllName - имя скомпилированной библиотеки DLL.

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

interface MoreConstants {
    int MAGIC = 0xCAFEBABE;
    interface PROPERTIES {
        String NAME = "name";
    }
    enum ERRORS {
        ON_FIRE, ASLEEP, BROKEN, UNSURE;
    }
}

и получить к ним доступ таким образом, предполагая статический импорт интерфейса MoreConstants :

if (!PROPERTIES.NAME.equals(value)) {
    return ERRORS.UNSURE;
}

Конечно, эти интерфейсы никогда не должны реализовываться, что я считаю плохой практикой. Однако единственный способ обеспечить это - строгие проверки кода ...

2
ответ дан 27 November 2019 в 16:41
поделиться
Другие вопросы по тегам:

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