【问题标题】:(JAVA Enums) - Anonymous class inside enum constant(JAVA Enums) - 枚举常量内的匿名类
【发布时间】:2019-06-20 06:45:43
【问题描述】:

美好的一天!

我有一个只实现一个方法的接口。我不想创建几个类都实现这个单一方法,因此我决定改用匿名类。

我对某些静态项目使用枚举,这些枚举具有我的接口的实例。但是,当我尝试在我的枚举常量中创建一个匿名类时,我的 IDE(eclipse)实际上什么也没告诉我(就好像它在代码块之外一样)。

我的问题如下:我可以在枚举常量中使用匿名类吗?

如果我的文字不清楚(对不起,我不是英语),请参阅下面的示例。

代码示例

/**
 * My Interface 
 */

public interface IPotato {

    public void eatPotato();
} 

/**
* My enum class
*/
    public enum PotatoEnum {

        I_WANT_TO_EAT_POTATO(new IPotato() {
            @Override
            public void eatPotato() {
                // Cant put code here.
            } });

        private IPotato _myAnonymousClass;
        private PotatoEnum(IPotato anonymousClass){
            this._myAnonymousClass = anonymousClass;
        }

        public IPotato getPotato(){
            return _myAnonymousClass;
        }

    }

【问题讨论】:

标签: java enums anonymous-class


【解决方案1】:

你可以这样做,这是一个完全有效的解决方案。

作为建议,让您的枚举实现您的接口以使代码更具可读性:

public enum PotatoEnum implements IPotato{

        I_WANT_TO_EAT_POTATO(){

            @Override
            public void eatPotato() {
                // Cant put code here.

            }},//more ENUMS ;

    }

【讨论】:

    【解决方案2】:

    没错

    通过这样做,您正在做类似的事情:

    I_WANT_TO_EAT_POTATO(An object of a virtual class that implments IPotato class);
    

    同:

    I_WANT_TO_EAT_POTATO(Passing any parameter defined by constructor);
    

    Enum 常量视为内部类,您正在向它们传递其构造函数的参数

    【讨论】:

      【解决方案3】:

      你可以做到。您犯错的原因是您在单个文件中有两个公共标识符(枚举和接口)。从枚举中删除公共,它将起作用

      public interface IPotato {
          public void eatPotato();
      }
      
      enum PotatoEnum {
      
          I_WANT_TO_EAT_POTATO(new IPotato() {
              @Override
              public void eatPotato() {
                  // Cant put code here.
              }
          });
      
          private IPotato _myAnonymousClass;
      
          private PotatoEnum(IPotato anonymousClass) {
              this._myAnonymousClass = anonymousClass;
          }
      
          public IPotato getPotato() {
              return _myAnonymousClass;
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-09
        • 2016-08-15
        相关资源
        最近更新 更多