2017-02-07 9 views
1

У меня есть следующие классы: package util;Как передать константы методу?

public final class Constant { 

    private Constant() { 
     throw new AssertionError(); 
    } 

    public static class Product { 
     public static final String CODE = "Product"; 
     public static final String A = "product_5g2g"; 
     public static final String B = "product_a45h"; 
     public static final String C = "product_a3ag"; 
     //more constants.. 
    } 

    public static class Employee { 
     public static final String CODE = "Employee"; 
     public static final String A = "employee_1g3f"; 
     public static final String B = "employee_h52d"; 
     public static final String C = "employee_h5d2"; 
     //more constants.. 
    } 

    public static class Client { 
     public static final String CODE = "Client"; 
     public static final String A = "client_h5ad"; 
     public static final String B = "client_1df1"; 
     public static final String C = "client_6g23"; 
     //more constants.. 
    } 
} 

и:

package util; 

import util.Constant.*; 

public class Main { 

    public void run() { 
     if (isSelected(Product.CODE)) { 
      if (isSelected(Product.A) || isSelected(Product.B)) { 
       //do something 
      } 
      compute(Product.C); 
      //more similar instruction that use constants from Product class 
     } 
     if (isSelected(Employee.CODE)) { 
      if (isSelected(Employee.A) || isSelected(Employee.B)) { 
       //do something 
      } 
      compute(Employee.C); 
      //more similar instruction that use constants from Employee class 
     } 
     if (isSelected(Client.CODE)) { 
      if (isSelected(Client.A) || isSelected(Client.B)) { 
       //do something 
      } 
      compute(Client.C); 
      //more similar instruction that use constants from Client class 
     } 
    } 

    public boolean isSelected(String s) { 
     return true; 
    } 

    public void compute(String s) { 

    } 
} 

Как вы можете видеть, этот блок кода

if (isSelected(StaticClass.CODE)) { 
    if (isSelected(StaticClass.A) || isSelected(StaticClass.B)) { 
     //do something 
    } 
    compute(StaticClass.C); 
    //more similar instruction that use constants from Product class 
} 

повторяется, но не может поставить его в отдельный метод, потому что Java не разрешить статический класс как параметр public void method(StaticClass) {}.

Как я могу реорганизовать вышеуказанный код? Моя первая мысль заключалась в том, чтобы заставить Singletons расширить базовый класс или реализовать общий интерфейс. Есть лучшее решение?

+1

Вы проверили Enums? – mc20

+1

Я бы пересчитал Enums и подумал о методах переключения и извлечения. – Nico

+0

@Jorji У вас есть два ответа на ваш вопрос. Пожалуйста, оставьте комментарий к ответам, если вам нужно дополнительное разъяснение или принять один из ответов как правильный, щелкнув галочку. Голосование бесплатное. Принятие ответа дает вам два момента. Тебе нечего терять. Сообщите мне, есть ли у вас проблемы, которые мешают вам комментировать или принимать ответы. – CKing

ответ

1

Что вы ищете, это Enum. Переопределите все ваши классы как Enum s. Например, вы можете redfine в Product класс следующим образом:

public enum Product { 
    CODE("Product"), 
    A("product_5g2g"); 

    private String value; 
    //define others constants in a similar fasion 
    public Product(String value) { 
     this.value = value; 
    } 
} 

Enums могут быть переданы в качестве параметров метода. В вашем конкретном примере, вы можете сделать это:

public void method(Constants.Product product) { 

} 

Тем не менее, вы должны обязательно рассмотреть альтернативный способ для достижения своей цели. Взгляните на Replacing conditionals with Polymorphism для начала.

1

Вы должны изучить полиморфизм здесь. Пример: вместо того, чтобы делать

if (X) { 
doY(); 
} 

«хорошо» OO выглядит гораздо больше, как:

Y y = getMeSomeY(); 
y.doTheY(); 

Где getMeSomeY() возвращает вам именно то, что требуется (так Y может быть интерфейс, и этот метод обеспечивает разные реализации этого интерфейса, которые все делают несколько разные вещи). Дело в том, что вы написали процедурный код, где вы спросите что-то, чтобы затем принять решение об этом. Хорошее ОО выступает за противоположное (tell don't ask).

Вы начинаете с ... не делая все плоские строки. Делая так, вы отказываетесь от всего «статического ввода». Если ваш код принимает решения только по строкам, почему вы программируете на Java? Вы можете очень хорошо использовать не типичный язык, чем. Итак, по крайней мере, узнайте о перечислениях Java; и использовать их. Но, пожалуйста, поймите: перечисления - это не real ответ здесь. Они просто помогут сделать ваш код немного лучше.

действительный проблема здесь в том, что вы хотите написать код, делая эти if (x) then y повсюду.

Возможно, вы уже догадались: здесь нет простого ответа. Что бы я сделал: во-первых, отступите. И тщательно изучите ваш дизайн. Код, который у вас есть прямо сейчас, указывает мне, что ваша базовая объектная модель далека от «полезной».И в этом весь смысл OO: вы создаете классы и объекты, которые помогают вам писать чистый, элегантный код. Но когда ваш базовый дизайн не поддерживает это; то нет смысла пытаться реорганизовать код, который вышел из этого. Потому что уродство вашего кода - всего лишь симптом; основная причина заключается в вашем дизайне внизу.

+0

'getMeSomeY()' с аргументом будет иметь больше смысла;) – CKing

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