繁体   English   中英

组织Java常量的理想方法

[英]Ideal way to organize Java constants

我们有一个基于旧的jdk 1.4的庞大项目。 我们已将Web应用程序迁移到JDK 1.6,但代码中仍然存在大量低效的实践和糟糕的设计。

关于主要的痛点点巨大的java类在单个java文件中有2500多行代码。 这么多文件都是这样的。

试图通过删除常量并将常量放在不同的Constants.java文件中来重构我开始的类。 但由于整个应用程序中有很多常量,因此常量文件存在增长到巨大比例的风险。

我希望得到关于开发人员采用什么策略来保持代码清洁和可维护性的反馈。

将你的常数保持在与他们相关的类中,不要觉得有必要提取它们。 它可能会清理类的代码,但在文件中混合不相关的常量并不是一种改进。

保持相关的事物

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

将所有常量放在一个文件中是一个糟糕的主意! 尤其是uber-Constant反模式,其中所有常量都在每个类必须implementInterface中。 周日可怕的10种方式! 当人们在Java之前的1990年代早期开始做这件事时,这是一个坏主意! 这绝对是2012年的一个坏主意!

这意味着每次导入此uber-Constants文件时,您都会混合大量不相关的信息并创建不需要的依赖项。 一起使用的东西应该放在Enum或者至少在使用它们作为其方法参数的Class ,这样当它们被更改时,您就知道如何轻松地进行影响分析。

想象一下使用与其他业务领域常量混合的DaysOfTheWeek常量混合的Color常量,在单个文件中将有数百个甚至数千个这样的东西。 怎么能被认为是个好主意? 在每个非人为的情况下,作为Classpublic inner成员的Enum是更好的解决方案。

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

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

努力实现高凝聚力 ,这意味着尽可能保持相关事物的紧密结合。

争取松散耦合这意味着不要让不相关的东西泄漏到其他不相关的范围内。

努力实现自我记录的可维护代码,所有混合在一起的数十或数百private static final String/int声明不符合任何人的标准!

在2012年,当您使用Enum作为工具时,C风格常量是一个糟糕的解决方案,您应该专注于尽可能多地将这些常量组转换为Enum Enum是类型安全的,可以附加其他属性和属性以及行为以使其intelligent 这是走下坡路的道路。

只是将常量放在Constant.java文件中并不会让我觉得敏感(它只是将问题移开)。 但有时我会重新组合它们以清除事物并使用几个文件重新组合它们: DatabaseConstants.javaGraphicConstants.java等等......当然,使用枚举也很有用(和最佳实践)。

编辑:准确地说,我实际上使用的是Java ME应用程序,因此它只是一种“模仿”我不能拥有的枚举的方法,在抽象类中使用“受控词汇表”(我想念所有Java EE功能...... 。)

对于访问此页面的人。

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

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

更新:

作为一种最佳实践,最好使用Class。(参见评论。感谢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);
    }
}

我想分享几年前我见过的常数的设计模式,可能会有所帮助。

首先创建一个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"; 
}

在键入“MyPackageConstants”时在IDE中。 你应该看到整个应用程序的所有常量。

我从未听说过将所有常量都放在一个java文件中。 最好的方法是将常量与类本身相对应,但是用大写字母和下划线命名它们就像这样:EXAMPLE_CONSTANT

您是否尝试过将Enums用于所有常量? 我被告知这是自Java 1.5以来的首选方式。

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

我认为如果你有超过2500个LOC的多个java文件,决定放置常量的位置应该是你问题中最少的。 您应该清楚地了解重组系统的外观。 这可能比决定在哪里坚持常量和其他句法考虑因素要困难得多,但仍然需要首先完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM