Tag: 枚举

枚举单例如何运作?

以前不是使用枚举,我会做类似的事情: public static ExampleClass instance; public ExampleClass(){ instance=this; } public static ExampleClass getInstance(){ return instance; } 然后有人告诉我一个枚举单身人士: public enum Example{ INSTANCE; public static Example getInstance(){ return Example.INSTANCE; } 在第一个例子中,我必须实例化对象才能创建实例。 有了枚举,我不需要这样做..至少它出现了。 有人可以解释这背后的原因吗?

抽象类的集合(或类似的东西……)

情景 我正在制作一个涉及汽车的Java程序。 注意:我已经简化了这种情况(尽我所能),使其更通用,更容易理解。 我实际上并不是在和汽车一起工作。 我创建了一个Cars类,它是Car对象的集合。 Car对象具有speed (double)和year (int)。 构造函数将year作为参数,例如: public class Car { private int year; private double speed; public Car(int year) { this.year = year; } } 这是一个棘手的部分……汽车必须有一种(让我们说Corvette或Clunker)。 Corvette的speed为0.9而Clunker的speed为0.1 。 如果没有指定它应该是什么样的汽车, Car永远不能被实例化。 所以现在,要创造一辆汽车,我们有: Car car = new Car(1998, Corvette); 我们刚刚创建的Corvette将是一个speed为0.9的Car对象。 问题 我的实际情况涉及更多种类的汽车,每辆汽车除了speed之外还有几个特定属性(也许还有color , numDoors和fuelTankSize )。 有这么多种车(每种都有自己的特定属性),代码变得比我想要的更复杂。 可能的解决方案 我可以使用子类,也就是说,有一个由Corvette和Clunker扩展的抽象Car类,但后来我Clunker了使用Cars对象的问题(因为我不能创建一些无法实例化的东西的集合)。 见下面的编辑。 使用枚举(如CarKind )似乎需要几个凌乱的switch语句: 填充每辆车的speed场 从Cars类创建Car对象 等等 […]

Java 1.6中的枚举类主体特性

enum CoffeeSize{ BIG(8), HUGE(10), OVERWHELMING(16) { public String getLidCode(){ return “A”; } }; private int ounces; public int getOunces(){ return ounces; } CoffeeSize(int ounces){ this.ounces = ounces; } public String getLidCode(){ return “B”; } } 这是K&B 6书中的SCJP 1.6问题。 这是常量特定类主体的一个示例,作为SCJP 6的一个特性。如何执行此操作并查看结果输出? 我有两个问题: 我的Java main方法是什么样的?请帮我执行这个部分代码。 我无法理解输出的行为方式。 getLidCode()方法如何在Java 1.6中的这个类体中工作?

如果我在编译时不知道该类,如何获得Enum的值?

我正在尝试执行以下操作: Class cls = unknownClass; if(cls.isEnum()){ @SuppressWarnings(“unchecked”) Class<? extends Enum> enumClass = (Class<? extends Enum>) cls; Object val = Enum.valueOf(enumClass, “NAME1”); } 但是我收到以下错误: Bound mismatch: The generic method valueOf(Class, String) of type Enum is not applicable for the arguments (Class<capture#5-of ? extends Enum>, String). The inferred type capture#5-of ? extends Enum is not a valid […]

Java:Enums的通用方法

帮我理解generics。 假设我有两个枚举作为内部类,如下所示: public class FoodConstants{ public static enum Vegetable { POTATO,BROCCOLI,SQUASH,CARROT; } public static enum Fruit { APPLE,MANGO,BANANA,GUAVA; } } 而不是让两个枚举实现一个接口,并且必须两次实现相同的方法,我希望在外部类中有一个方法,它可以执行以下操作: public String getEnumString<Enum e, String s){ for(Enum en: e.values()){ if(en.name().equalsIgnoreCase(s)){ return s; } } return null; } 但是这种方法不能编译。 我想要做的是找出一个字符串值是否是枚举值的名称,在任何枚举中,无论是蔬菜,水果还是什么都没有。 无论这是否实际上是一种冗余方法,我试图(重新)编写的那个有什么问题? 基本上我想这样做: public class FoodConstants{ public static enum Vegetable { POTATO,BROCCOLI,SQUASH,CARROT; } public static enum […]

如何使用枚举或任何其他方式在java中构建类别的层次结构树?

假设我们有一组类别:categories = {A,B}。 让我们更多地假设A由子类别组成:{A1,A2,A3}和B由子类别组成:{B1,B2}。此外,还有更多子类别如下:对于A1:{A1a,A1b},对于A2 :{A2a,A2b},A3:{A3a,A3b,A3c},B1:{B1a,B1b,B1c},B2:{B2a,B2b}。 如何在java中构建层次结构? 由于每个集合的基数是固定的并且事先已知,我最初的方法是使用枚举类型而不是使用inheritance构建类,但我对任何建议持开放态度。 我不知道如何处理这个问题。 提前致谢。

使用枚举作为地图的关键

我想使用enum作为键和对象作为值。 以下是示例代码段: public class DistributorAuditSection implements Comparable{ private Map questionComponentsMap; public Map getQuestionComponentsMap(){ return questionComponentsMap; } public void setQuestionComponentsMap(Integer key, Object questionComponents){ if((questionComponentsMap == null) || (questionComponentsMap != null && questionComponentsMap.isEmpty())){ this.questionComponentsMap = new HashMap(); } this.questionComponentsMap.put(key,questionComponents); } } 它现在是一个普通的hashmap,带有整数键,对象作为值。 现在我想将其更改为Enummap 。 这样我就可以使用enum键了。 我也不知道如何使用Enummap检索值。

如何实现具有枚举的接口,其中接口扩展为Comparable?

考虑以下代码: public interface Foo extends Comparable {} public enum FooImpl implements Foo {} 由于类型擦除的限制,我收到以下错误: java.lang.Comparable不能使用不同的参数inheritance: 和 我有以下要求: FooImpl需要是一个枚举,因为我需要将它用作注释中的默认值。 我的界面合同是它需要具有可比性。 我已经尝试在接口中使用generics边界,但Java不支持。

Java Enums的性能?

我正在实施一个2人游戏,它将在紧密的循环中运行数十万次,然后是性能至关重要。 我的代码实际上看起来像这样: public class Table { private final int WHITE_PLAYER = +1; private final int BLACK_PLAYER = -1; private final int currentPlayer; private final int otherPlayer; … } 我想知道如果我选择更换会不会有任何性能损失 private final int WHITE_PLAYER = +1; private final int BLACK_PLAYER = -1; 枚举定义为 public enum Players { WhitePlayer, BlackPlayer } 我认为枚举只是整数常量的语法糖,并且对于测试枚举生成的字节码以及调用它的代码进行釉面查看,似乎表明使用它们确实与制作静态相同方法调用,但适用于首次运行时设置的某些枚举基础结构。 我的假设是,确实使用枚举作为静态常量是正确的还是我错过了什么?

现在更好的Java单例模式?

您知道,自Java 5发布以来,在Java中编写Singleton模式的推荐方法是使用枚举。 public enum Singleton { INSTANCE; } 但是,我不喜欢这个 – 是强制客户端使用Singleton.INSTANCE来访问单例实例。 也许,更好的方法是在普通类中隐藏Singleton,并提供更好的单例设施访问: public class ApplicationSingleton { private static enum Singleton { INSTANCE; private ResourceBundle bundle; private Singleton() { System.out.println(“Singleton instance is created: ” + System.currentTimeMillis()); bundle = ResourceBundle.getBundle(“application”); } private ResourceBundle getResourceBundle() { return bundle; } private String getResourceAsString(String name) { return bundle.getString(name); } }; […]