在Java中保存一些硬编码信息的最佳实践

在Java中保存一些硬编码信息的最佳实践,java,enums,Java,Enums,如果我有很多常数,比如shortName=rule1;描述=描述1;规则2/说明2;规则3/说明3?我需要找出某个短名称的描述,由一个参数给出,最好的方法是什么 会是这样的枚举吗 public enum Description { RULE1 ("rule1", "description1"), RULE2 ("rule2", "description2"), RULE3 ("rule3

如果我有很多常数,比如shortName=rule1;描述=描述1;规则2/说明2;规则3/说明3?我需要找出某个短名称的描述,由一个参数给出,最好的方法是什么

会是这样的枚举吗

public enum Description {

   RULE1 ("rule1", "description1"),
   RULE2 ("rule2", "description2"),
   RULE3 ("rule3", "description3");

   private final String shortName;

   private final String description;

   Description(String shortName, String description) {
     this.shortName= shortName;
     this.description = description;
   }
}
但是如果我有一个像private String getDescriptionString shortName这样的方法,我如何使用enum来获取在enum中声明的shortName的描述? 我不能使用常量,因为我有大约200个这样的定义。

枚举定义一个类型 你问:

我需要找出某个短名称的描述,由一个参数给出,最好的方法是什么

会是这样的枚举吗

public enum Description {

   RULE1 ("rule1", "description1"),
   RULE2 ("rule2", "description2"),
   RULE3 ("rule3", "description3");

   private final String shortName;

   private final String description;

   Description(String shortName, String description) {
     this.shortName= shortName;
     this.description = description;
   }
}
是的,如果这些规则1、规则2等在概念上都是相同类型的成员

例如:

public enum Pet{ DOG , CAT , BIRD , HAMSTER }
public enum Flavor{ VANILLA , CHOCOLATE, STRAWBERRY }
public enum Color{ BURLYWOOD , CORNFLOWER_BLUE, DARK_SLATE_GREY }
使用这样的枚举意味着您可以编写其他代码,即,确保有效值,以及更多

另一方面,如果您的值是不相关的,只是出于各种目的的各种字符串的大杂烩,我会使用字符串常量。如果它们是本地化的资源,请使用特定的本地化工具

你问:

但是如果我有一个像private String getDescriptionString shortName这样的方法,我如何使用enum来获取在enum中声明的shortName的描述

这个问题表明你正在传递短名称的文本,作为找到描述的关键。但是您不应该传递字符串,应该传递枚举对象。以enum为例。你应该在星期六的第二天而不是星期六

但如果必须,可以在枚举上实现一个静态方法来循环所有枚举对象以找到一个匹配的对象

// Utility method to loop all the enum objects until finding a match.
public static String getLongStringForShortName ( String shorty )
{
    String result = null;
    if ( RULE1.shortName.equals( shorty ) ) { result = RULE1.description; }
    if ( RULE2.shortName.equals( shorty ) ) { result = RULE2.description; }
    if ( RULE3.shortName.equals( shorty ) ) { result = RULE3.description; }
    return result;
}
或者,在另一种语法中,使用流来软编码对每个枚举对象的引用

// Utility method to loop all the enum objects until finding a match.
public static String getLongStringForShortName ( String shorty )
{
    String result = "";
    Optional < Description > optionalDesc = Arrays.stream( Description.values() ).filter( ( Description d ) -> d.description.equals( shorty ) ).findFirst();
    if ( optionalDesc.isPresent() ) { result = optionalDesc.get().description; }
    return result;
}
枚举图 您可以混合使用枚举和映射的概念。你的问题缺乏背景,无法知道这是否适合你。但仅供参考

将枚举类更改为:

package work.basil.example;

public enum Description
{
    RULE1, RULE2, RULE3;
}
    
使用将这些枚举对象映射到其他对象,如字符串

Map < Description, String > descriptionToLongForm = new EnumMap <>( Description.class );
descriptionToLongForm.put( Description.RULE1 , "description1" );
descriptionToLongForm.put( Description.RULE2 , "description2" );
descriptionToLongForm.put( Description.RULE3 , "description3" );

String longDesc = descriptionToLongForm.get( Description.RULE2 );

使用Enum.valueOf接收基于字符串的枚举值,确保已通过StringtoUpperCase将其转换为大写。在文件外部指定规则,然后读取该文件以填充映射可能更具可伸缩性。没错,我最好使用属性文件而不是枚举!你说“这个问题表明你在传递短名称的文本,作为找到描述的关键。”。我们不仅在应用程序中“传递数据”,我们还经常通过基于文本的结构化语言和协议(如xml或json)与其他人交换数据。然后我们需要将它们转换为内部数据,enum+dict是执行此任务的好工具。
Map < Description, String > descriptionToLongForm = new EnumMap <>( Description.class );
descriptionToLongForm.put( Description.RULE1 , "description1" );
descriptionToLongForm.put( Description.RULE2 , "description2" );
descriptionToLongForm.put( Description.RULE3 , "description3" );

String longDesc = descriptionToLongForm.get( Description.RULE2 );
Map < Description, String > descriptionToLongForm =
        Map.of(
                Description.RULE1 , "description1" ,
                Description.RULE2 , "description2" ,
                Description.RULE3 , "description3"
        );

String longDesc = descriptionToLongForm.get( Description.RULE2 );