2015-03-21 3 views

ответ

1

Вы можете уменьшить количество кода, передав основные свойства в качестве свойств с каждым перечислением. signPair использует некоторые элементарные арифметические свойства для вычисления ординала перевернутого квадранта.

public enum Quadrant { 
    Q1(true,true), 
    Q2(false, true), 
    Q3(false, false), 
    Q4(true, false); 

    private boolean xpos; 
    private boolean ypos; 
    Quadrant(boolean xpos, boolean ypos){ 
    this.xpos = xpos; 
    this.ypos = ypos; 
    } 
    public boolean xPositive(){ 
    return xpos; 
    } 
    public boolean yPositive(){ 
    return ypos; 
    } 
    public String signPair(){ 
    return "(" + (xpos ? "+" : "-") + "," + (ypos ? "+" : "-") + ")"; 
    } 
    public Quadrant flipX(){ 
    return values()[ordinal() + 1 - 2*(ordinal()%2)]; 
    } 
    public static Quadrant fromInts(int x, int y){ 
    if(x >= 0){ 
     return y >= 0 ? Quadrant.Q1 : Quadrant.Q4; 
    } else { 
     return y >= 0 ? Quadrant.Q2 : Quadrant.Q3; 
    } 
    } 
} 

Вы также можете определить методы для каждого перечисления:

public enum Quadrant { 
    Q1(true,true){ 
    public Quadrant flipX(){ return Quadrant.Q2; } 
    public String signPair(){ return "(+,+)"; } 
    }, 
    Q2(false, true){ 
    public Quadrant flipX(){ return Quadrant.Q1; } 
    public String signPair(){ return "(-,+)"; } 
    }, 
    Q3(false, false){ 
    public Quadrant flipX(){ return Quadrant.Q4; } 
    public String signPair(){ return "(-,-)"; } 
    }, 
    Q4(true, false){ 
    public Quadrant flipX(){ return Quadrant.Q3; } 
    public String signPair(){ return "(+,-)"; } 
    }; 
    //... 
    public abstract String signPair(); 
    public abstract Quadrant flipX(); 
    //... 
} 

Вот тест:

public static void main(String[] args) { 
    for(Quadrant q: Quadrant.values()){ 
    System.out.println(q); 
    System.out.println(q.xPositive()); 
    System.out.println(q.yPositive()); 
    System.out.println(q.signPair()); 
    System.out.println(q.flipX()); 
    } 
    for(int x = -1; x <= 1; ++x){ 
    for(int y = -1; y <= 1; ++y){ 
     System.out.println(Quadrant.fromInts(x, y)); 
    } 
    } 
} 

Чтобы запустить необходимые основные, аргументы процесса:

public static void main(String[] args) { 
    for(int i = 2; i <= args.length; i++){ 
     int x = Integer.parseInt(args[i-2]); 
     int y = Integer.parseInt(args[i-1]); 
     Quadrant q = Quadrant.fromInts(x, y); 
     System.out.println("(+ x + "," + y + ") in " + q + " " + q.signPair()); 
    } 
} 
+0

удивительным ! но для меня это слишком много, мне нужно усваивать его медленно, чтобы получить полное понимание. Кроме того, как насчет основного метода? У меня есть некоторые требования о том, что должен делать основной метод. –

+0

Я добавил тест, но вы тоже могли бы это сделать. – laune

+0

@laune Хотя ваш ответ правильный, я хотел бы указать, что использование 'ordinal()' считается плохой практикой. –

Смежные вопросы