Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用内部静态final字段初始化Java枚举?_Java_Enums - Fatal编程技术网

如何使用内部静态final字段初始化Java枚举?

如何使用内部静态final字段初始化Java枚举?,java,enums,Java,Enums,我正在设计一款纯文字的视频游戏,游戏中的两个角色不常出现在一起,但在内心和性格上非常相似 我的问题是,我不知道如何通过使用静态最终内部常量的构造函数初始化enum常量。否则这场比赛就可以开始了 这是一个两难的问题: 如果我没有弄错的话,枚举常量必须在枚举的第一行中定义 第一行不能引用它后面的任何内容(即“不能引用定义前的字段”) 我如何解决这个第二十二条军规 以下是根据保密协议从游戏中发布的一些示例代码: enum ValiantHeroWithPrincessSavingTendencies

我正在设计一款纯文字的视频游戏,游戏中的两个角色不常出现在一起,但在内心和性格上非常相似

我的问题是,我不知道如何通过使用静态最终内部常量的构造函数初始化
enum
常量。否则这场比赛就可以开始了

这是一个两难的问题:

  • 如果我没有弄错的话,枚举常量必须在枚举的第一行中定义
  • 第一行不能引用它后面的任何内容(即“不能引用定义前的字段”)
  • 我如何解决这个第二十二条军规

    以下是根据保密协议从游戏中发布的一些示例代码:

    enum ValiantHeroWithPrincessSavingTendencies {
    
      SUPERMARIO(TYPICAL_QUOTE_FROM_MARIO), ZELDA(TYPICAL_QUOTE_FROM_ZELDA);
    
      private String aPreparedQuotePurportedToBeSpontaneousAlmostImpulsive;
    
      public String getQuoteUnderStressfulCircumstances() {
        return aPreparedQuotePurportedToBeSpontaneousAlmostImpulsive;
      }
    
      private ValiantHeroWithPrincessSavingTendencies(String quote) {
        aPreparedQuotePurportedToBeSpontaneousAlmostImpulsive = quote;
      }
    
      private static final String TYPICAL_QUOTE_FROM_ZELDA = "Have at ya!";
      private static final String TYPICAL_QUOTE_FROM_MARIO = "We, wagliu'!";
    }
    

    我试图用马里奥的“典型”来初始化SUPERMARIO,但我还没有定义马里奥的“典型”。我认为,在SUPERMARIO之前移动私有静态final字段是非法的。

    唯一可行的选择是a)将常量移动到另一个类,或者b)直接将常量放入值初始值设定项中

    如果移动常量,则可以使该类成为枚举中的静态类:

    enum ValiantHeroWithPrincessSavingTendencies {
      SUPERMARIO(Quotes.TYPICAL_QUOTE_FROM_MARIO),
      ZELDA(Quotes.TYPICAL_QUOTE_FROM_ZELDA);
    
      private String aPreparedQuotePurportedToBeSpontaneousAlmostImpulsive;
    
      public String getQuoteUnderStressfulCircumstances() {
        return aPreparedQuotePurportedToBeSpontaneousAlmostImpulsive;
      }
    
      private ValiantHeroWithPrincessSavingTendencies(String quote) {
        aPreparedQuotePurportedToBeSpontaneousAlmostImpulsive = quote;
      }
    
      private static class Quotes {
        private static final String TYPICAL_QUOTE_FROM_ZELDA = "Have at ya!";
        private static final String TYPICAL_QUOTE_FROM_MARIO = "We, wagliu'!";
      }
    }
    

    私有静态最终常量是枚举的本地常量;只需在实例定义中对它们进行编码。在此之后,可以从
    一个preparedquotepurportedtobeasurgeneralmostpulsive
    变量内部访问它们。

    您始终可以执行类似以下的黑客操作:

    public enum Derp
    {
        SOMETHING(),
        SOMETHINGELSE();
    
        private String herp;
    
        public static final String A = "derp", B = "derp2";
    
        public String getHerp()
        {
            return herp;
        }
    
        static
        {
            SOMETHING.herp = A;
            SOMETHINGELSE.herp = B;
        }
    }
    

    您可以通过类名访问它们:

    enum ValiantHeroWithPrincessSavingTendencies {
        SUPERMARIO(ValiantHeroWithPrincessSavingTendencies.TYPICAL_QUOTE_FROM_MARIO),
        ZELDA(ValiantHeroWithPrincessSavingTendencies.TYPICAL_QUOTE_FROM_ZELDA);
    
        ...
    
        private static final String TYPICAL_QUOTE_FROM_ZELDA = "Have at ya!";
        private static final String TYPICAL_QUOTE_FROM_MARIO = "We, wagliu'!";
    }
    

    这比Brian的解决方案更简单

    我想说的是,换个方式做就行了。但是您将这些字段设置为私有。它们怎么会有用呢?这一切背后的功能需求/设计考虑是什么?为什么不将字符串放在枚举构造函数中,而不是使用一个无用的(私有的)静态final字段?像这样:
    SUPERMARIO(“haveatya!”),…
    @BalusC。。。但它是面向对象的:-)如果我有一个常量值,我总是将它表示为
    静态final
    ,不是吗?如果常量值在类之外没有用处,我总是将其标记为private。当我是自己代码的客户时,会减少混乱,并且可见性会为我隐藏常量。听起来公平吗?我喜欢这个!让我们看看是否有人能做得更好,但我已经在我的视频游戏编辑器中输入了这个。。。让我们看看我是否可以通过拯救一些公主来获得几个小时的乐趣。为什么要为那些只属于enum本地的东西而烦恼呢?这太复杂了,没有什么好的理由。@JimGarrison您可能想重用字符串。“Have at ya!”字符串也适用于某些圣杯搜索者驱逐舰;)因为我有一个我想尊重的惯例:没有“魔法数字”,也没有像五彩纸屑一样到处撒字符串文字。@Brian这都是私人的。这本身就是OO的严格性和复杂性,“好处”是可疑的。如果字符串不是枚举的私有字符串,那么它们将属于自己的外部类/接口,而这个问题甚至不存在。这是非常实用的。但假设我有一个1M行的项目,并希望对其进行静态分析,以检测硬编码的文字(有点像“FindBugs”?或某种“CheckStyle”?)。。。突然间,我不得不打破惯例,仅仅是因为
    enums
    处理“第一行”的古怪方式?嗯……哇。。。那太令人讨厌了。我不会想到的。。。有趣!这不管用吗?我测试过,效果很好。如果一个人不想吃东西,你就停止喂他们。你不会切开他们的胃,把食物塞进他们的肚子里。那么,究竟为什么要对枚举执行此操作?哇,我很惊讶这能解决编译器错误。但是,这只适用于编译时内联的常量(原语和字符串);否则,在初始化常量之前初始化枚举值时,将取消对该常量的引用。