是否有必要在Java的枚举中使用toString()?

时间:2017-05-04 17:06:18

标签: java enums

我认为我们不能实例化Enum。那么我们需要为枚举设置toString(),equals()和hashCode()方法吗?这句话是真的吗?

另外作为后续问题 “this”关键字在以下枚举类中引用了什么?

public enum DocuType {
       text, print, html, pdf; //Why aren't these in caps? 

       public boolean isPrint() {return this == print; }  //What does this refers to?
       public boolean isText() {return this == text; }

       public boolean isTextOrPrint() { return isText() || isPrint(); }
}

如何调用此枚举的任何布尔方法,因为它们不是静态的? 当我打电话时,关键字“this”指的是什么?

4 个答案:

答案 0 :(得分:2)

  

那么我们需要为枚举设置toString(),equals()和hashCode()方法吗?这句话是真的吗?

你不需要在枚举中使用任何这些方法。

  

另外作为一个跟进问题"这个"关键字是指以下枚举类?

想象一下,你有这段代码:

DocuType myType = DocuType.print;

如果要检查文档是否为PRINT文档,可以执行以下操作:

boolean isPrint = myType.isPrint();

在这种情况下,thismyType,这意味着它是print枚举。最后,结果为true,因为print == print;

答案 1 :(得分:2)

  

我认为我们不能实例化Enum。

Enum是类型之一,因为我们有类类型。我们可以创建类的实例(即创建变量)的方式,类似地,我们可以创建Enum的变量,但这只是在定义期间,最终使它们成为常量。

  

那么我们需要为枚举设置toString(),equals()和hashCode()方法吗?

等于()& hashcode()用于比较两个实例。在类实例的情况下,实例是动态创建的。所以这意味着我们事先没有关于实例的知识,因此我们需要比较它们以了解它们是否相等。但是,在Enum的情况下,我们知道定义Enum时的实例。所以,我们事先知道它们是否平等。如果枚举实例意味着相等,为什么在地球上我们需要两个单独的相等枚举实例。因此,在enum的情况下,我们通常不会覆盖这些方法。

  

"这是什么"关键字是指以下枚举类?

&安培;

  

如何调用此枚举的任何布尔方法,因为它们不是静态的?

&安培;

  

同样,当我打电话时,关键字"这是什么"是指?

表示当前正在访问的实例。在您的示例中,您将 DocuType 实例作为text,pdf,print,html。当您在任何实例上调用方法时,例如:DocuType.text.isPrint(), isPrint 方法中的关键字将指向 text 。因此,例如pdf,除了isPdf()。

之外,所有方法都将返回false

答案 2 :(得分:1)

我还建议您阅读Tutorial到枚举

似乎你缺乏枚举概念的知识。

对于你的上一个问题,枚举是静态的,但它的每个“类型”都是一个对象,这意味着你可以做到

DocuType.html.isText(); // false
DocuType.print.isPrint(); // true

要为自己的Enum注册,你必须

DocuType TextDocu = DocuType.text;

你可以用CAPS写它们,但你不必这样做,但它是推荐的。 更详细地解释一下:

enum DocuType //this is an enum and not instantiatable
text,print,html,pdf // these are Objects with the functions of the enum and are an instance 

答案 3 :(得分:0)

作为解释的准备,快速回顾历史。 在使用Java提供枚举之前,可能已经构建了一个可能的替换:

public class DocuType {
   public final static DocuType text=new DocuType();
   public final static DocuType print=new DocuType();
   public final static DocuType html=new DocuType();
   public final static DocuType pdf=new DocuType();

   private DocuType(){}; // hide constructor

   public boolean isPrint() {return this == print; }
   public boolean isText() {return this == text; }

   public boolean isTextOrPrint() { return isText() || isPrint(); }
}

正如您所看到的,虽然您无法创建DocuType的新实例,但已在类中为您准备了4个静态实例。

Javas enum的工作与那个例子非常相似(显然涉及的写作较少);因此,this指的是您执行方法的实例。关于toString,它取决于你;默认实现可以是否足够好。无需同时实施equalshashCode