【问题标题】:Abstract fields implemented by static final class?静态最终类实现的抽象字段?
【发布时间】:2015-08-31 16:52:53
【问题描述】:

我正在尝试为我的 Android 应用创建自定义调色板。我是这样开始的:

public class Theme {

    public static final class DARK {
        final static int POSITIVE_GREEN = Color.rgb(0, 200, 0);
        final static int NEGATIVE_RED = Color.rgb(200, 0, 0);
        final static int BACKGROUND_GREEN = Color.argb(255 - 220, 0, 255, 0); //220
        final static int BACKGROUND_RED = Color.argb(255 - 220, 255, 0, 0);
    }

    public static final class PASTEL {
        final static int POSITIVE_GREEN = Color.parseColor("#326262");
        final static int NEGATIVE_RED = etc
        final static int BACKGROUND_GREEN = etc
        final static int BACKGROUND_RED = etc
    }

}

但是当我想重构其中一个字段名称时,我意识到有些不对劲。字段名称在主题或其他内容中应该是抽象的,但由于这些不应该是可实例化的类,我不能使用这里建议的构造函数技巧: Why not abstract fields? 我该怎么做?

【问题讨论】:

  • 您是否尝试过为此查看枚举?
  • 您不能强制开发人员覆盖某个字段。但是,你可以强制他们重写一个方法。

标签: java android field abstract-class color-palette


【解决方案1】:

在这里使用接口似乎很合适:

每个主题都会实现这个接口:

public interface Theme {
    int getPositiveGreen(); 
    ...
}

例如:

public class Dark implements Theme {

   private final static int POSITIVE_GREEN = Color.rgb(0, 200, 0);

   public int getPositiveGreen() {
       return POSITIVE_GREEN;
   }
   ....
}

一般来说,公共静态变量的使用应该仅限于一些非常简单的场景,这不是您想要实现的。

https://docs.oracle.com/javase/tutorial/java/concepts/interface.html

【讨论】:

    【解决方案2】:

    抽象方法只是子类需要提供的一个函数。

    “抽象字段”也可以被认为是一个需要提供的值

    public class Theme {
    
        public final int POSITIVE_GREEN;
        public final int NEGATIVE_RED;
        public final int BACKGROUND_GREEN;
        public final int BACKGROUND_RED;
    
        private Theme(int POSITIVE_GREEN, int NEGATIVE_RED, int BACKGROUND_GREEN, int BACKGROUND_RED)
        {
            this.POSITIVE_GREEN = POSITIVE_GREEN;
            this.NEGATIVE_RED = NEGATIVE_RED;
            this.BACKGROUND_GREEN = BACKGROUND_GREEN;
            this.BACKGROUND_RED = BACKGROUND_RED;
        }
    
        public static final Theme DARK = new Theme(
            Color.rgb(0, 200, 0),
            Color.rgb(200, 0, 0),
            Color.argb(255 - 220, 0, 255, 0),
            Color.argb(255 - 220, 255, 0, 0)
        );
    
        public static final Theme PASTEL = new Theme( ...
    

    【讨论】:

      【解决方案3】:

      使用枚举而不是 int 常量 您可以改用枚举,例如:

      public enum DARK {
              POSITIVE_GREEN (0,200, ..){
                    void abstractField(){
                       //Achieve your custom methods
                    }
              },
              NEGATIVE_RED (200,0, ..){
                 //Achieve your custom methods
              },
              BACKGROUND_GREEN (.....){
                 //Achieve your custom methods
              },
              BACKGROUND_RED (...){
                //Achieve your custom methods
              },
            
      
             // Offer (with the Senate) constructor to initialize the fields defined
             DARK (int variable1, int variable2) {
                      this.variable1 = variable1;
                      this.variable2 = variable2;
             }
             // Define the fields you need
             private int variable1;
             private int variable2;
      
             //Custom abstract methods you need
             abstract void abstartField();
      }
      

      不知道你能不能帮忙

      【讨论】:

        【解决方案4】:

        如果您只想使用名称合同,您可以使用以下概念。

        public interface Theme {
            public int POSITIVE_GREEN;
            public int NEGATIVE_RED;
            public int BACKGROUND_GREEN;
            public int BACKGROUND_RED;
            public Color getColor(int colorName);
        }
        
        public static final class Theme1 extends Theme {
            Map<Integer, Color> colorMap = new HashMap<>();
            private Theme1() {
                colorMap.put(POSITIVE_GREEN, Color.rgb(0, 200, 0));
                colorMap.put(NEGATIVE_RED, Color.rgb(200, 0, 0));
                colorMap.put(BACKGROUND_GREEN, Color.argb(255 - 220, 0, 255, 0));
                colorMap.put(BACKGROUND_RED, Color.argb(255 - 220, 255, 0, 0));
            }
        
            @Override
            public Color getColor(int colorName) {
                return colorMap.get(colorName);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2011-06-21
          • 2011-04-02
          • 2010-10-23
          • 2015-05-19
          • 2014-06-19
          • 1970-01-01
          • 2012-09-29
          • 1970-01-01
          • 2011-11-15
          相关资源
          最近更新 更多