【问题标题】:Java constant objects and fieldsJava 常量对象和字段
【发布时间】:2018-03-07 07:57:54
【问题描述】:

我想创建一个名为 ObjectsInfos.java 的文件 它有太多对象的信息。 哪种方式是解决问题的最佳方式?哪一种最有效? 辛格尔顿?遗产? ..?

感谢您的帮助。

.. 编辑。信息将在稍后添加。所以我必须将信息写入一个新的 java 文件。

//ObjectsInfos.java
    public class ObjectsInfos{

         public class Object1Info{
              static final int attr1 = 1;
              static final int attr2 = 5;
         }

         public class Object2Info{
              static final int attr1 = 3;
              static final int attr2 = 6;
         }
    }
    ---------------------------
    //Another java class
        static void main(){
            myGenericMethod(ObjectsInfos.Object1Info.attr1, ObjectsInfos.Object1Info.attr2);
            myGenericMethod(ObjectsInfos.Object2Info.attr1, ObjectsInfos.Object2Info.attr2);
        }

【问题讨论】:

  • “对象太多”您是如何确定是这种情况的?
  • 你的代码看起来……充其量是令人困惑的。
  • 不清楚,你到底想达到什么。当 Object1 和 Object2 只有静态最终属性时,为什么要定义它们?您可以直接在 ObjectsInfo 中使用这些属性。
  • 您的代码中根本没有对象,只有类...
  • "哪种方式是解决问题的最佳方式?" - 究竟是什么问题?

标签: java object static constants final


【解决方案1】:

听起来你在寻找enum

public enum ObjectsInfos{
    Object1Info(1,5),
    Object2Info(3,6);
    private final int attr1;
    private final int attr2;

    ObjectsInfos(int attr1, int attr2) {
        this.attr1 = attr1;
        this.attr2 = attr2;
    }

    public int getAttr1() {
        return attr1;
    }

    public int getAttr2() {
        return attr2;
    }
}

【讨论】:

    【解决方案2】:

    您还可以在类中定义一组枚举。例如,如果您考虑食物及其类别:

    public class Food {
    
        private Food() {
        }
    
        enum Fruit {
            BANANA,
            ORANGE
        }
    
        enum Vegetable {
            CARROT,
            LETTUCE
        }
    
        enum Cereal {
            CORN,
            WHEAT
        }
    
        enum Meat {
            COW,
            PORK
        }
    
        enum Sauce {
            TOMATOE,
            MUSTARD
        }
    }
    

    枚举是简单的Stringint 常量的强大替代方案。他们为您提供了一些开箱即用的方法,例如 valuesvalueOf,它们非常方便并在其之上输入安全(您不会仅使用 ints)。

    下面是一个简单的例子,说明如何使用上述枚举:

    import java.util.Arrays;
    import java.util.stream.Stream;
    
    public class FoodMain {
    
        public static void main(String[] args) {
            System.out.println(isCereal("bla"));
            System.out.println(isCereal("wheat"));
            Stream.of(Food.Fruit.values()).forEach(System.out::println);
        }
    
        private static boolean isCereal(String cereal) {
            return Arrays.stream(Food.Cereal.values()).anyMatch(c -> c.toString().equalsIgnoreCase(cereal));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多