我认为我们不能实例化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”指的是什么?
答案 0 :(得分:2)
那么我们需要为枚举设置toString(),equals()和hashCode()方法吗?这句话是真的吗?
你不需要在枚举中使用任何这些方法。
另外作为一个跟进问题"这个"关键字是指以下枚举类?
想象一下,你有这段代码:
DocuType myType = DocuType.print;
如果要检查文档是否为PRINT文档,可以执行以下操作:
boolean isPrint = myType.isPrint();
在这种情况下,this
是myType
,这意味着它是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
,它取决于你;默认实现可以是否足够好。无需同时实施equals
和hashCode
。