2015-06-16 5 views
1

Я пытаюсь создать пользовательские цветовые палитры для своего приложения для 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? Как мне это сделать?

+0

Вы пробовали посмотреть в Enums для этого? – Acapulco

+1

Вы не можете заставить разработчика переопределить определенное поле. Но вы можете заставить их переопределить метод. – Aakash

ответ

2

Использование интерфейсов кажется apppropriate здесь:

Каждая тема будет реализовывать этот интерфейс:

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

1

Используйте перечисление вместо 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(); 
} 

Я не знаю, если вы можете помочь

1

Абстрактный метод просто функции, которые должен предоставить подкласс.

«абстрактное поле» можно рассматривать как значение, которое должно быть обеспечено слишком

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

Если вы просто хотите контракт имен, которые будут использоваться, вы можете использовать ниже концепции.

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); 
    } 
} 
Смежные вопросы