Идеальный способ организовать Java-константы - PullRequest
16 голосов
/ 28 февраля 2012

У нас огромные проекты на основе старого jdk 1.4.Мы перенесли веб-приложение на JDK 1.6, но в коде все еще много неэффективных методов и плохого дизайна.

Одна из главных проблем - огромные классы Java, содержащие более 2500 строк кода в одном файле Java.Очень много таких файлов.

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

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

Ответы [ 8 ]

17 голосов
/ 28 февраля 2012

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

Держите вещи вместе .

А также вы можете конвертировать их в Перечисления , когда это возможно / полезно (но это может потребовать некоторого рефакторинга).

13 голосов
/ 28 февраля 2012

Поместить все константы в один файл - ужасная идея! Особенно убер-константный анти-паттерн, где все константы находятся в Interface, который каждый класс имеет implement. 10 способов до воскресенья страшны! Это была плохая идея, когда люди начали делать это еще в начале 1990-х до Java! Это определенно плохая идея в 2012 году!

Это означает, что вы смешиваете много несвязанной информации и создаете ненужные зависимости каждый раз, когда вы импортируете этот файл uber-Constants. Вещи, которые идут вместе, должны быть вместе в Enum или, по крайней мере, в Class, который использует их в качестве аргументов своих методов, чтобы при их изменении вы знали, как легко проводить анализ воздействия.

Представьте себе Color константы, смешанные с DaysOfTheWeek константами, смешанными с другими константами бизнес-доменов, и в одном файле их будет сотни, если не тысячи. Как это можно считать хорошей идеей? В каждом не надуманном случае Enum, который является public inner членом Class, является лучшим решением.

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

При проектировании и рефакторинге вы всегда должны:

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

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

Стремитесь к самодокументируемому сопровождаемому коду, десяткам или сотням объявлений private static final String/int, смешанным вместе, не соответствует никому определенному стандарту!

В 2012 году константы в стиле C являются плохим решением, поскольку теперь у вас есть Enum в качестве инструмента, вы должны сосредоточиться на преобразовании как можно большего количества этих групп констант в Enum, где это возможно. Enum является типобезопасным и может иметь другие атрибуты, свойства и поведение, связанные с ним, чтобы сделать их intelligent. Это путь, чтобы идти вниз.

2 голосов
/ 28 февраля 2012

Простое помещение констант в файл Constant.java, на мой взгляд, не имеет смысла (это просто устраняет проблему). Но иногда я использую, чтобы перегруппировать их, чтобы очистить вещи и использовать несколько файлов, чтобы перегруппировать их: DatabaseConstants.java, GraphicConstants.java и так далее ... и, конечно, использование перечислений также может быть полезным (и лучшая практика).

edit: если быть точным, я на самом деле работаю с приложением Java ME, так что это просто способ "подражать" перечислениям, которых у меня нет, с помощью "контролируемого словаря" в абстрактных классах (я скучаю по всем Java EE особенности ...)

1 голос
/ 09 июня 2017

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

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

Теперь в каждом подпакете вашего приложения создайте файл констант, который будет связан только с подпакетом.Так что если бы вы имели.подпакет Login называется только константой, связанной с логином.Но ключ заключается в расширении BaseConstants.Таким образом, вы видите все глобальные константы в средстве выбора IDE, но когда вы открываете файл, вы видите только константы вашего пакета.При этом я думаю, что константные файлы могут получить очень тяжелые и повторяющиеся значения, которые трудно прочитать.

Вот что я имею в виду ..

public class BaseConstants{

public static final String GLOBAL1= "GLOBAL string"; 

public static final String GLOBAL2= "another GLOBAL string"; 
}

Теперь во всех других ваших пакетах создайте такие файлы:

class MyPackageConstants extends BaseConstants{

public static final String LOCAL1 = "local String"
public static final String LOCAL2= "ANOTHER LOCAL string"; 
}

в вашей IDE при вводе "MyPackageConstants «.Вы должны увидеть все константы для всего приложения.

1 голос
/ 21 марта 2017

Для тех, кто посещает эту страницу.

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

public interface Constants {
    public static final String CREATE_USER = "createUser";
    // Nested Interface.
    public interface ProjectConstants {
        public static final String CREATE_PROJECT = "createProject";
        public static final String INVALID_SESSION = "Invalid Session";
        // As you know they are implicity public static final.
    }
}// Accessed as: 
Constants.ProjectConstants.CREATE_PROJECT

Обновление:

В качестве лучшей практики лучше использовать класс. (См. Комментарии. Спасибо keplerian.)

public final class Constants {

    private Constants() {
        // restrict instantiation
    }

    public static final double PI = 3.14159;
    public static final double PLANCK_CONSTANT = 6.62606896e-34;
}

import static Constants.PLANCK_CONSTANT;
import static Constants.PI;

public class Calculations {

    public double getReducedPlanckConstant() {
        return PLANCK_CONSTANT / (2 * PI);
    }
}
0 голосов
/ 28 февраля 2012

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

0 голосов
/ 28 февраля 2012

Вы пробовали использовать Enums для всех своих констант?Мне сказали, что это предпочтительный способ начиная с Java 1.5.

http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html

0 голосов
/ 28 февраля 2012

Я никогда не слышал о том, чтобы поместить все константы в один файл Java. Лучший способ - поместить константы, связанные с классами, в себя, но назвать их заглавными буквами и подчеркнуть следующее: EXAMPLE_CONSTANT

...