关于编码风格:组织Java常量的理想方式

Ideal way to organize Java constants

我们有一个基于旧JDK 1.4的大型项目。我们已经将Web应用程序迁移到JDK1.6,但代码中仍然存在许多效率低下的实践和糟糕的设计。

关于单个Java文件中的主要疼痛点巨大Java类2500行+代码。像这样的文件太多了。

为了重构类,我首先删除了常量,并将常量放在不同的constants.java文件中。但是由于应用程序中有如此多的常量,所以常量文件有增长到巨大比例的风险。

对于开发人员采用什么策略来保持代码的整洁和可维护性,我将不胜感激。


将常量保存在它们相关的类中,不要觉得有义务提取它们。它可以清除类的代码,但在文件中混合不相关的常量并不是一个改进。

把事情联系在一起。

而且,您也可以在可能/有用时将它们转换为枚举(但这可能需要一些重构)。


将所有常量放在一个文件中是一个糟糕的主意!尤其是Uber常数反模式,所有常数都在一个Interface中,每个类都必须在implement中。10个星期天的方法太糟糕了!这是一个坏主意,当人们开始做它在1990年初之前的Java!在2012年这绝对是个坏主意!

这意味着每次导入这个uber常量文件时,您都会混合许多与之无关的信息,并创建不需要的依赖项。结合起来的东西应该放在一个Enum中,或者至少放在一个Class中,它使用这些东西作为方法的论据,这样当它们被改变时,你就知道如何轻松地进行影响分析。

假设Color常量与DaysOfTheWeek常量混合在一起,与其他业务域常量混合在一起,那么在一个文件中就会有数百个(如果不是数千个)这些东西。怎么会认为这是个好主意呢?在每一个非人为的情况下,作为Classpublic inner成员的Enum是一个更好的解决方案。

它还意味着您有一个单一的平面名称空间来尝试创建不冲突的名称,然后这些名称就不明显它们属于什么以及应该如何使用。这从来不是一个积极的锻炼。

在设计和重构时,您应该始终:

争取高凝聚力,这意味着尽可能地保持相关事物的紧密联系。

争取松耦合,这意味着不要让不相关的事情泄漏到其他不相关的范围。

争取自我记录可维护代码,几十或数百个private static final String/int声明混合在一起,不符合任何标准的定义!

在2012年,c型常数是一个糟糕的解决方案,当你现在使用Enum作为一个工具时,你应该集中精力尽可能多地将这些常数组转换为EnumEnum是类型安全的,可以附加其他属性、属性和行为,使它们成为intelligent。这是一条可以走下去的路。


在我看来,仅仅把常量放在Constant.java文件中并不能使sens(它只是把问题移开)。但有时我会用重组的方法来清理这些东西,用几个文件来重组它们:DatabaseConstants.javaGraphicConstants.java等等……当然,使用枚举也很有用(也是最佳实践)。

编辑:确切地说,我实际上使用Java ME应用程序,所以它只是一种"模仿"我无法拥有的枚举的方法,在抽象类中有一个"受控词汇表"(我想念所有的JavaEE特性……)


我想分享一个几年前我看到的常量的设计模式,也许能有所帮助。

首先创建一个baseconstant文件。这将保存所有包可以使用的所有全局常量。

现在,在应用程序的每个子包中,创建一个只与子包相关的常量文件。如果你有。名为login的子包只将与login相关的常量放在那里。但关键是扩展baseconstants。这样,您就可以在IDE选择器中看到所有的全局常量,但是当您打开文件时,只看到包常量。也就是说,我认为常量文件会变得非常重、重复,而且很难读取。

我的意思是……

1
2
3
4
5
6
public class BaseConstants{

public static final String GLOBAL1="GLOBAL string";

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

现在,在所有其他包中创建这样的文件:

1
2
3
4
5
class MyPackageConstants extends BaseConstants{

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

在您的IDE中键入"myPackageInstants"时,您应该看到整个应用程序的所有常量。


对于访问此页面的人。

如果不想维护多个常量文件,下面是更好的组织方法。

1
2
3
4
5
6
7
8
9
10
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

更新:

作为最佳实践,最好使用类(参见注释)。谢谢开普勒人。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);
    }
}


您是否尝试对所有常量使用枚举?据我所知,这是自Java 1.5以来的首选方式。

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


我从来没有听说过把所有的常量都放在一个Java文件中。最好的方法是将与类相适应的常量放在它们自己中,但是用大写字母和下划线命名它们,如下面的例子常量


我认为如果你有超过2500个位置的多个Java文件,那么在哪里放置常量的决定应该是你的最小问题。您应该清楚地了解重组后的系统将是什么样子的。这可能比决定把常量和其他句法考虑放在哪里困难得多,但仍然需要先做。