Хорошая практика для организации атрибутов в классе? - PullRequest
2 голосов
/ 15 марта 2012

У меня в классе много параметров, многие из которых связаны друг с другом.

Во-первых, у меня было что-то вроде:

public class MyClass {
    private int[] filterA = {4,40};
    private int filterAPasses = 3;

    private String dataFilePath = "...";
    private int dataChannels = 4;
    private int dataFreq = 300;

    private int[] timeRange = {30,40};
}

Ну, я был не очень доволен, не легко читался в самих декларациях и не очень удобен в использовании, потому что у меня было много filterA[0], где я должен был запомнить значение индекса 0 и индекса 1.

Итак, вместо этого я сделал:

public class MyClass {
    private interface filterA {
        int left = 4;
        int right = 40;
        int passes = 4;
    }

    private interface dataFile {
        String path = "...";
        int channels = 4;
        int frequency = 300;
    }

    private interface timeRange {
        int from = 30;
        int to = 40;
    }
}

, что намного лучше и позволяет мне делать хорошие вещи, такие как filterA.left или даже добавлять javadoc в left

Но почему-то мне не хочется использовать interface для этого.Это хороший способ?Есть ли лучшие практики для таких вещей?

Редактировать:

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

Ответы [ 5 ]

2 голосов
/ 15 марта 2012

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

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

1 голос
/ 15 марта 2012

Вы можете использовать вложенные классы, если считаете, что это понятнее.

public class MyClass {
    static class FilterA {
        int left = 4;
        int right = 40;
        int passes = 4;
    }
    private final FilterA filterA = new FilterA();

    static class DataFile {
        String path = "...";
        int channels = 4;
        int frequency = 300;
    }
    private final DataFile dataFile = new DataFile();

    private interface TimeRange {
        int from = 30;
        int to = 40;
    }
    private final TimeRange timeRange = new TimeRange();
}

или просто использовать комментарии и значимые имена.(Мои предпочтения)

public class MyClass {
    // fliter settings
    private int filterALeft = 4;
    private int filterARight = 40;
    private int filterAPasses = 3;

    // data path attributes
    private String dataFilePath = "...";
    private int dataChannels = 4;
    private int dataFreq = 300;

    // time range
    private int timeRangeFrom = 30;
    private int timeRangeTo = 40;
}
1 голос
/ 15 марта 2012

Вы не хотите использовать интерфейсы для определения констант, это обычный антипаттерн, как вы можете прочитать из Effective Java (2nd edition), пункт 19. Интерфейсы должны использоваться только для определения типов, а не констант.

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

Если вы хотите, вы можете определить методы доступа в интерфейсе (например, getFilter). Для этого и создаются интерфейсы (определяя поведение, а не реализацию).

1 голос
/ 15 марта 2012

Вы должны создать константы следующим образом:

public class FilterA {
  public static final int LEFT = 4;
  public static final int RIGHT = 40;
  public static final int PASSES = 4; 
} 

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

FilterA.LEFT

Поскольку «ЛЕВЫЙ» является целым капиталом, вполне понятно, что он постоянен, и вы просто хотите его использовать.Если вы хотите изменить их, вы можете удалить final.

0 голосов
/ 15 марта 2012

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

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