有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

由静态final类实现的java抽象字段?

我正在尝试为我的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? 我该怎么做


共 (4) 个答案

  1. # 1 楼答案

    如果你只是想使用一个合同的名称,你可以使用下面的概念

    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);
        }
    }
    
  2. # 2 楼答案

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

    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();
    }
    

    我不知道你是否能帮忙

  3. # 3 楼答案

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

    每个主题都将实现这个界面:

    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

  4. # 4 楼答案

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

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

    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( ...