Разрешить создание определенных c переменных класса на основе значения переменной - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть случай использования, когда мне нужно создать экземпляр данного класса только с указанными c переменными, основанными на значении переменной (скажем, в этом примере) typeName. Для переменной String typeName, если ее значение равно TYPE-1, только указанный c набор переменных (a, b, c) должен быть разрешен для создания экземпляра. Точно так же, если его значением является TYPE-2, только другой набор переменных (x, y, z) должен быть разрешен для создания экземпляра.

if(typeName == "TYPE1") 
 {
     CentralClass class = new CentralClass(a,b,c);  //initiating only variable a,b,c
 }
else
{  
     CentralClass class = new CentralClass(x,y,z);  //initiating only variable x,y,z
}

Структура класса

public class CentralClass {

 String typeName; //ALLOWED Values TYPE1, TYPE2
 String x;
 String y;
 String z;

 String a;
 String b;
 String c;
}

Что было бы наилучшим способом сделать это с помощью любого шаблона проектирования et c.

Примечание : Структура класса открыта для изменения. У нас может быть несколько классов (клубные разные переменные), внутренние классы, классы stati c или любой другой шаблон проектирования и т. Д.

1 Ответ

1 голос
/ 29 апреля 2020

Ответ

Шаблон компоновки идеально подходит для вашего случая использования. Это позволит вам создать объект только с определенными полями. Лучше использовать конструктор, чем передавать значение «null» в конструктор для полей, которых у вас нет.

Вы можете быстро добавить все методы компоновщика, используя Lombok .


Примечания

  • Как правило, только половина значений, заполненных классом, является признаком того, что вы должны создавать отдельные классы.
  • Когда вы говорите, что «typeName» может иметь только значения «TYPE1» или «TYPE2», вы должны использовать enum вместо String. Этот анти-шаблон часто называют примитивной одержимостью .

Код решения

Шаблон строителя (без Ломбока)

public class CentralClass {

    String typeName; //ALLOWED Values TYPE1, TYPE2
    String x;
    String y;
    String z;

    String a;
    String b;
    String c;

    CentralClass(String typeName, String x, String y, String z, String a, String b, String c) {
        this.typeName = typeName;
        this.x = x;
        this.y = y;
        this.z = z;
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public static CentralClassBuilder builder() {
        return new CentralClassBuilder();
    }

    public static class CentralClassBuilder {
        private String typeName;
        private String x;
        private String y;
        private String z;
        private String a;
        private String b;
        private String c;

        CentralClassBuilder() {
        }

        public CentralClassBuilder typeName(String typeName) {
            this.typeName = typeName;
            return this;
        }

        public CentralClassBuilder x(String x) {
            this.x = x;
            return this;
        }

        public CentralClassBuilder y(String y) {
            this.y = y;
            return this;
        }

        public CentralClassBuilder z(String z) {
            this.z = z;
            return this;
        }

        public CentralClassBuilder a(String a) {
            this.a = a;
            return this;
        }

        public CentralClassBuilder b(String b) {
            this.b = b;
            return this;
        }

        public CentralClassBuilder c(String c) {
            this.c = c;
            return this;
        }

        public CentralClass build() {
            return new CentralClass(typeName, x, y, z, a, b, c);
        }
    }
}

Конструктор (с Ломбоком)

@Builder
public class CentralClass {

    String typeName; //ALLOWED Values TYPE1, TYPE2
    String x;
    String y;
    String z;

    String a;
    String b;
    String c;
}

Использование

if(variable == "TYPE1")
{
    CentralClass aClass = CentralClass.builder()
            .a("A")
            .b("B")
            .c("C")
            .build();
}
else
{
    CentralClass aClass = CentralClass.builder()
            .x("X")
            .y("Y")
            .z("Z")
            .build();
}

Подробнее:

https://dzone.com/articles/design-patterns-the-builder-pattern

...