【问题标题】:Why can constructors within an enum in Java be declared only private? [duplicate]为什么Java枚举中的构造函数只能声明为私有? [复制]
【发布时间】:2011-12-24 03:33:44
【问题描述】:

可能重复:
Why can't enum constructors be protected or public in Java?

下面的代码只是演示了enum 在Java 中的使用。和那个enum的成员的值没有任何关系,只是总结一下。

package enumtest;

enum Sum
{        
    Pen(10),Pencil(15),Eraser(5);

    private int value;

    private Sum(int value)
    {
        this.value=value;
    }

    public int getValue()
    {
        return(value);
    }
}

final public class Main
{
    public static void main(String...args)
    {
        int sum=0;

        for(Sum o:Sum.values())
        {
            sum+=o.getValue();
        }

        System.out.println("sum = "+sum);
    }
}

它在控制台上显示sum = 30。这里只有一个问题。一般来说,在一个类中,构造函数声明为public,那么为什么enum中的构造函数只能声明为private?其他修饰符 publicprotected 不允许与它一起使用。即使将其声明为 public 也会导致编译时错误。为什么?

【问题讨论】:

    标签: java constructor enums


    【解决方案1】:

    您也可以不使用任何关键字声明它们,例如只是Sum(int value)

    原因是因为 Java 本身会为您创建各种实例,并且作为 Singletons - 这是 Enums 正常工作所必需的。 publicprotected 将暗示或允许其他调用者创建相同枚举的其他实例,这将破坏单例保证。

    【讨论】:

    • 嗯,但包保护(无修饰符)构造函数很好,我们可以为那个构造函数制作基本相同的参数..
    • 如果没有为普通类的构造函数指定访问修饰符,则构造函数具有默认访问权限。如果没有为枚举类型的构造函数指定访问修饰符,则构造函数是private。如果将 enum 类型(第 8.9 节)的构造函数声明为 publicprotected,则这是一个编译时错误。来自 [§8.8.3] java.sun.com/docs/books/jls/third_edition/html/… JLS。
    • 以上是针对 Java 6 语言规范的。在 Java 8 规范中,枚举构造函数可见性的信息现在位于 §8.9.2
    猜你喜欢
    • 2019-10-06
    • 2016-07-17
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2023-04-04
    • 2019-11-05
    相关资源
    最近更新 更多