Java 枚举正试图通过不存在的公共初始值设定项初始化自身

Java 枚举正试图通过不存在的公共初始值设定项初始化自身,java,intellij-idea,enums,initialization,Java,Intellij Idea,Enums,Initialization,我有一个枚举,布局。我使用私有初始值设定项定义了一些成员(不记得正确的术语)。出于某种原因,它声称“布局是抽象的;无法实例化“(Intellij Idea)。我声明的私有初始值设定项显示了一条警告,表示它从未被使用过。代码: public static enum Layout { CHARGE("Charge", false, false), FESS("Fess", true, true), PALE("Pale", true, true), QUARTE

我有一个枚举,布局。我使用私有初始值设定项定义了一些成员(不记得正确的术语)。出于某种原因,它声称“布局是抽象的;无法实例化“(Intellij Idea)。我声明的私有初始值设定项显示了一条警告,表示它从未被使用过。代码:

public static enum Layout {
    CHARGE("Charge", false, false),

    FESS("Fess", true, true),

    PALE("Pale", true, true),

    QUARTERLY("Quarterly", true, false),

    PARTY_PER_PALE("Party per pale", true, false),

    BORDURE("Bordure", true, false),

    PARTY_PER_BEND_SINISTER("Party per bend sinister", true, false),

    SCARPE("Scarpe", true, false),

    THREE("Three", false, false),

    COUNTERCHARGED("Countercharged", false, false);

    public final String name;
    public final boolean hasSecondary;
    public final boolean chargeInSecondary;

    public abstract String blazon(CoatOfArms paramCoatOfArms);

    public abstract void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3);

    public abstract void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2);

    private Layout(String name, boolean hasSecondary, boolean chargeInSecondary) {
        this.name = name;
        this.hasSecondary = hasSecondary;
        this.chargeInSecondary = chargeInSecondary;
    }
}

由于您在
enum
中声明了
abstract
方法,因此它被认为是
abstract
(类似于一个抽象类),这就是您无法实例化它的原因。您也不能将其声明为静态

固定枚举:

public enum Layout {
    CHARGE("Charge", false, false),

    FESS("Fess", true, true),

    PALE("Pale", true, true),

    QUARTERLY("Quarterly", true, false),

    PARTY_PER_PALE("Party per pale", true, false),

    BORDURE("Bordure", true, false),

    PARTY_PER_BEND_SINISTER("Party per bend sinister", true, false),

    SCARPE("Scarpe", true, false),

    THREE("Three", false, false),

    COUNTERCHARGED("Countercharged", false, false);

    public final String name;
    public final boolean hasSecondary;
    public final boolean chargeInSecondary;

    private Layout(String name, boolean hasSecondary, boolean chargeInSecondary) {
        this.name = name;
        this.hasSecondary = hasSecondary;
        this.chargeInSecondary = chargeInSecondary;
    }
}

由于您在
enum
中声明了
abstract
方法,因此它被认为是
abstract
(类似于一个抽象类),这就是您无法实例化它的原因。您也不能将其声明为静态

固定枚举:

public enum Layout {
    CHARGE("Charge", false, false),

    FESS("Fess", true, true),

    PALE("Pale", true, true),

    QUARTERLY("Quarterly", true, false),

    PARTY_PER_PALE("Party per pale", true, false),

    BORDURE("Bordure", true, false),

    PARTY_PER_BEND_SINISTER("Party per bend sinister", true, false),

    SCARPE("Scarpe", true, false),

    THREE("Three", false, false),

    COUNTERCHARGED("Countercharged", false, false);

    public final String name;
    public final boolean hasSecondary;
    public final boolean chargeInSecondary;

    private Layout(String name, boolean hasSecondary, boolean chargeInSecondary) {
        this.name = name;
        this.hasSecondary = hasSecondary;
        this.chargeInSecondary = chargeInSecondary;
    }
}

两个问题:1)不能将枚举定义为
static
。事实上,它们已经是。2) 不能在枚举中包含抽象方法。您必须完全定义所有方法。

有两个问题:1)不能将枚举定义为
static
。事实上,它们已经是。2) 不能在枚举中包含抽象方法。您必须完全定义所有方法。

您应该将抽象方法排除在枚举之外

public abstract class MyClass {

    public static enum Layout {
        CHARGE("Charge", false, false),

        FESS("Fess", true, true),

        PALE("Pale", true, true),

        QUARTERLY("Quarterly", true, false),

        PARTY_PER_PALE("Party per pale", true, false),

        BORDURE("Bordure", true, false),

        PARTY_PER_BEND_SINISTER("Party per bend sinister", true, false),

        SCARPE("Scarpe", true, false),

        THREE("Three", false, false),

        COUNTERCHARGED("Countercharged", false, false);

        public final String name;
        public final boolean hasSecondary;
        public final boolean chargeInSecondary;

        private Layout(String name, boolean hasSecondary, boolean chargeInSecondary) {
            this.name = name;
            this.hasSecondary = hasSecondary;
            this.chargeInSecondary = chargeInSecondary;
        }
    }

     public abstract String blazon(CoatOfArms paramCoatOfArms);

     public abstract void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3);

     public abstract void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2);

}

您应该将抽象方法排除在枚举之外

public abstract class MyClass {

    public static enum Layout {
        CHARGE("Charge", false, false),

        FESS("Fess", true, true),

        PALE("Pale", true, true),

        QUARTERLY("Quarterly", true, false),

        PARTY_PER_PALE("Party per pale", true, false),

        BORDURE("Bordure", true, false),

        PARTY_PER_BEND_SINISTER("Party per bend sinister", true, false),

        SCARPE("Scarpe", true, false),

        THREE("Three", false, false),

        COUNTERCHARGED("Countercharged", false, false);

        public final String name;
        public final boolean hasSecondary;
        public final boolean chargeInSecondary;

        private Layout(String name, boolean hasSecondary, boolean chargeInSecondary) {
            this.name = name;
            this.hasSecondary = hasSecondary;
            this.chargeInSecondary = chargeInSecondary;
        }
    }

     public abstract String blazon(CoatOfArms paramCoatOfArms);

     public abstract void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3);

     public abstract void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2);

}

无法初始化抽象对象。由于枚举常量是初始化的,因此它们必须是非抽象的。因此,必须实施所有方法

您有两种选择:

  • 删除抽象方法
  • 为每个枚举常量实现抽象方法:

    public enum Layout {
        CHARGE("Charge", false, false) {
    
            @Override
            public String blazon(CoatOfArms paramCoatOfArms) {
                // ...
            }
    
            @Override
            public void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3) {
                // ...
            }
    
            @Override
            public void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2) {
                // ...
            }
    
        },
    
        FESS("Fess", true, true) {
    
           @Override
           public String blazon(CoatOfArms paramCoatOfArms) {
               // ...
           }
    
           @Override
           public void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3) {
                // ...
           }
    
           @Override
           public void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2) {
               // ...
           }
    
        }
    
        /*
         rest of the constants, each implementing the methods
         */ ;
    
        public final String name;
        public final boolean hasSecondary;
        public final boolean chargeInSecondary;
    
        public abstract String blazon(CoatOfArms paramCoatOfArms);
    
        public abstract void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3);
    
        public abstract void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2);
    
        private Layout(String name, boolean hasSecondary, boolean chargeInSecondary) {
            this.name = name;
            this.hasSecondary = hasSecondary;
            this.chargeInSecondary = chargeInSecondary;
        }
    }
    


  • static
    关键字也可能不属于那里,这取决于枚举的声明位置。

    抽象对象无法初始化。由于枚举常量是初始化的,因此它们必须是非抽象的。因此,必须实施所有方法

    您有两种选择:

  • 删除抽象方法
  • 为每个枚举常量实现抽象方法:

    public enum Layout {
        CHARGE("Charge", false, false) {
    
            @Override
            public String blazon(CoatOfArms paramCoatOfArms) {
                // ...
            }
    
            @Override
            public void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3) {
                // ...
            }
    
            @Override
            public void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2) {
                // ...
            }
    
        },
    
        FESS("Fess", true, true) {
    
           @Override
           public String blazon(CoatOfArms paramCoatOfArms) {
               // ...
           }
    
           @Override
           public void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3) {
                // ...
           }
    
           @Override
           public void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2) {
               // ...
           }
    
        }
    
        /*
         rest of the constants, each implementing the methods
         */ ;
    
        public final String name;
        public final boolean hasSecondary;
        public final boolean chargeInSecondary;
    
        public abstract String blazon(CoatOfArms paramCoatOfArms);
    
        public abstract void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3);
    
        public abstract void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2);
    
        private Layout(String name, boolean hasSecondary, boolean chargeInSecondary) {
            this.name = name;
            this.hasSecondary = hasSecondary;
            this.chargeInSecondary = chargeInSecondary;
        }
    }
    


  • static
    关键字也可能不属于那里,这取决于枚举的声明位置。

    如果向枚举中添加抽象方法,并且不对每个枚举常量重写它们,您认为会发生什么情况?我看到这段代码的编译错误,因为抽象方法没有过度使用。fabian是对的,枚举值需要覆盖枚举中的所有抽象方法。还要删除该静态。如果将抽象方法添加到枚举中,并且不对每个枚举常量重写它们,您认为会发生什么?我看到此代码的编译错误,因为抽象方法没有被重写。fabian是对的,您的枚举值需要重写枚举中的所有抽象方法。也要去除静电干扰。