【问题标题】:Allow instantiate of specific variables of a class based on the variable value允许根据变量值实例化类的特定变量
【发布时间】:2020-08-13 18:09:07
【问题描述】:

我有一个用例,我必须根据变量的值(在本例中说)typeName 仅使用特定变量来实例化给定的类。对于变量 String typeName,如果其值为 TYPE-1,则只应允许实例化特定的变量集 (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;
}

通过任何设计模式等最好的方法是什么。

注意:课程结构可以更改。我们可以有多个类(包含不同的变量)、内部类、静态类或任何强制执行的设计模式等。

【问题讨论】:

  • 我建议有多个类,每种类型一个,以及一个接受类型名称作为构造函数的静态方法。

标签: java class design-patterns types pojo


【解决方案1】:

回答

构建器模式非常适合您的用例。它将允许您创建仅包含某些字段的对象。最好使用构建器而不是将“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);
        }
    }
}

生成器模式(使用 Lombok)

@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

【讨论】:

  • 在这种情况下,用户是否会提供所有变量的值,然后根据类型只使用特定变量?我想允许用户以某种方式只传递特定变量的值而不是全部。
  • 这将取决于您的用户界面交互。你的问题是关于如何构造一个只有某些字段的对象。你没有提到任何类型的用户输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
相关资源
最近更新 更多