如何使用不同的枚举类型到一个对象来构建具有唯一值的

时间:2015-11-24 23:46:34

标签: java enums

查看了许多与将不同的枚举类型传递给方法相关的帖子,但不相信我的具体情况/问题已得到解决。

以下是我建立的枚举类型类(修改为隐藏机密信息):

public class ProjectA_Enums{
    private ProjectA_Enums(){
    }

    public enum TableA_Filter_Sort_Options{
        TIMESTAMP     ("TIMESTAMP", "tbla_timestamp"),
        USER          ("USER",      "tbla_user"),
        SHARE         ("SHARE",     "tbla_share"),
        CONDITION     ("CONDITION", "tbla_condition",
        TERMINAL      ("TERMINAL",  "tbla_terminal");

        private final String filter_name;
        private final String database_column_name;

        private TableA_Filter_Sort_Options(String filter_name,
                                           String database_column_name){
            this.filter_name = filter_name;
            this.database_column_name = database_column_name;
        }

        public String getFilter_name(){
            return filter_name;
        }

        public String getDatabase_column_name(){
            return database_column_name;
        }
    }

    public enum TableB_Filter_Sort_Options{
        TIMESTAMP     ("TIMESTAMP",      "tblb_timestamp"),
        ERROR_CODE    ("ERROR CODE",     "tblb_errcode"),
        ERROR_MESSAGE ("ERROR MESSAGE",  "tblb_errmsg");

        private final String filter_name;
        private final String database_column_name;

        private TableA_Filter_Sort_Options(String filter_name,
                                           String database_column_name){
            this.filter_name = filter_name;
            this.database_column_name = database_column_name;
        }

        public String getFilter_name(){
            return filter_name;
        }

        public String getDatabase_column_name(){
            return database_column_name;
        }
    }
}

现在情况如下:

我想调用类FilterSortDialogDisplay并传递枚举类型TableA_Filter_Sort_OptionsTableB_Filter_Sort_Options来构建并显示一个对话框GUI,显示滚动窗格中的适用过滤器。

此类允许用户选择适用的过滤器来执行数据库查询和所需的排序顺序。

对于枚举类型TableA_Filter_Sort_Options,显示的过滤器将为TIMESTAMP,USER,SHARE,CONDITION,TERMINAL,对于TableB_Filter_Sort_Options,显示的过滤器将为TIMESTAMP,ERROR CODE,ERROR MESSAGE。

与每个Enum类型值关联的第二个属性是关联的数据库表列,以在结果数据库查询SQL中使用。我在另一篇文章中看到,必须将接收方法的输入参数定义为Class。由于缺乏Java知识,我不确定如何编写代码以使用传入的Enum类型。

由于我已经使用相同的属性和方法设置了两个Enum类型,我希望能够将FilterSortDialogDisplay类中的属性转换为适当的Enum类型并调用这些方法。

希望Enum类型是用于执行定义功能的正确构造,因为将有额外的Enum类型具有不同的数字和过滤器值,需要生成和显示过滤器排序对话框,而不需要冗余代码基于Enum类型。

提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

我建议您不要使用枚举。从您的描述中听起来好像您想要传递包含足够信息的对象来显示过滤器信息并生成查询。我建议你定义一个interface,然后为各种表创建实现。

解决方案可能类似于:

public interface FilterSortOption {
    Stream<Criteria> getFilterCriteria();
    String generateQuery(Map<Criteria, Value> values);
}

void showDialogAndRunQuery(FilterSortOption option) {
    ....
}

然后你可以定义几个这样的实现。如果他们共享代码(因为他们可能),那么该代码可以进入一个单独的类,每个实现委托给。 可能该委托类可能使用枚举来包含列和条件信息。如果需要,我可以提供有关如何执行此操作的指示。

答案 1 :(得分:0)

你的问题没有非常简明扼要。我承认,毕竟,我不确定你需要什么帮助。我想说如果你的过滤器选项是一组在编译时已知的固定常量,那么使用枚举是一个很好的做法。

  

因为我已经设置了两个具有相同确切属性的枚举类型   方法,我希望能够在中投出一个属性   FilterSortDialogDisplay类到适当的Enum类型而且只是   称这些方法。

我将假设您要做的是调用一个方法,该方法将参数作为参数,该参数可以是枚举类型族的成员。这准确吗?

有一种模式可用于解决这种情况,即可扩展的枚举模式。在此模式中,您的枚举系列中的每个枚举类都实现了一个通用接口。例如:

public enum TableA_FilterSortOptions implements FilterOptions {
  :
  :
}

public enum TableB_FilterSortOptions implements FilterOptions {
  :
  :
}

public interface FilterOptions { ... }

此处,您家中的所有枚举类都共享一个公共类型FilterOptions。如果定义过滤方法以接受类型为FilterOptions的参数,则可以将任何实现枚举类中的任何常量传递给这些方法。

这里的限制是接口必须描述枚举类的所有功能,每个枚举类必须实现该功能。当您使用其接口类型传递枚举常量时,在传递常量的方法内,常量将“失去”其作为枚举常量的状态,因此只有接口方法可用。

那么,如果你需要枚举常量作为枚举函数中的枚举使用FilterOptions类型,你可以做什么(例如,你希望能够将常量添加到一个您的过滤方法中的EnumSet)?有一个解决方案。您可以定义使用交集类型的泛型方法。例如:

public static <E extends Enum<E> & FilterOptions> void applyFilter(E option) {
  :
  :
}

此方法定义为接受单个参数,该参数必须是枚举常量,它必须来自实现FilterOptions类型的枚举类。在此方法的正文中,E类型可以添加到EnumSet<E>的实例中,FilterOptions的所有方法也可用。