java - 在 Java 中,我将如何创建一个本质上是字符串子类但设置允许长度范围的类?

标签 java inheritance static subclass final

我正在尝试创建一个新的对象类型,它的作用类似于 String 的子类。我知道一个类不能扩展 String。我正在制作有要求的应用程序,例如联系人的名字不能超过 10 个字符,并且不能为空,姓氏不能超过 15 个字符。

我是这样开始类的:

package Models;

/**
 * @author Charles Hilton
 *
 */
public class LimitedString {
    private String value;
    private static final String descriptor;
    private static final Integer minimumLength;
    private static final Integer maximumLength;
    private static final boolean nullable;
    
    public LimitedString(String value, String descriptor, Integer maximumLength, Integer minimumLength, boolean isNullable) throws Exception {
        if (minimumLength < 0) {
            throw new IllegalArgumentException("Minimum length cannot be less than 0");
        }
        if (minimumLength > maximumLength) {
            throw new IllegalArgumentException("Minimum length cannot be greater than maximum length");
        }
        this.minimumLength = minimumLength;
        this.maximumLength = maximumLength;
        this.nullable = isNullable;
        this.descriptor = descriptor;   // i.e. descriptor = "Contact First Name"
        this.setValue(value);
    }
    
    LimitedString(String descriptor, Integer maximumLength, Integer minimumLength, boolean isNullable) {
        if (minimumLength < 0) {
            throw new IllegalArgumentException("Minimum length cannot be less than 0");
        }
        if (minimumLength > maximumLength) {
            throw new IllegalArgumentException("Minimum length cannot be greater than maximum length");
        }
        this.minimumLength = minimumLength;
        this.maximumLength = maximumLength;
        this.nullable = isNullable;
        this.descriptor = descriptor;   // i.e. descriptor = "Contact First Name"
        this.setValue(value);
    }

    public String ToString() {
        return this.value;
    }
    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        if (value == null && !nullable) throw new IllegalArgumentException("The value cannot be null.");
        if (value.length() < minimumLength || value.length() > maximumLength) {
            throw new IllegalArgumentException(String.format("@s must be between %s character(s) and %s characters long.", descriptor, minimumLength, maximumLength));
        }
        this.value = value;
    }

    public static String getDescriptor() {
        return descriptor;
    }

    public static Integer getMinimumlength() {
        return minimumLength;
    }

    public static Integer getMaximumlength() {
        return maximumLength;
    }

    public static boolean isNullable() {
        return nullable;
    }
    
}

然后像这样在 Contact 类中使用它:

/**
 * 
 */
package Models;

/**
 * @author Charles Hilton
 *
 */
public class Contact {
    private LimitedString firstName = new LimitedString("First Name", 10, 1, false);
    private LimitedString lastName = new LimitedString("Last Name", 15, 1, false);
    
    private Contact() {};
    
    public Contact(String lastName, String firstName) {
        this.setLastName(lastName);
        this.setFirstName(firstName);
    }
    
    public String getFirstName() {
        return firstName.getValue();
    }
    public void setFirstName(String firstName) {
        this.firstName.setValue(firstName);
    }
    public String getLastName() {
        return lastName.getValue();
    }
    public void setLastName(String lastName) {
        this.lastName.setValue(lastName);
    }
}

我担心它可以优化得更好。对于初学者,在 LimitedString 中。我将几个字段设置为静态字段和最终字段,目的是在将更多联系人添加到集合中时尽量减少内存使用,显然我现在无法按照我现在设置的方式进行操作。

最佳答案

字符序列

为了直接回答您的问题,我建议编写一个实现 CharSequence 的类界面。 StringStringBuilder 和其他一些类实现了该接口(interface)。

如果您希望能够向类的现有对象添加更多文本,您的类还应该实现Appendable。 .

我想您的类将包含一个 String。如果可追加,可能是一个 StringBuilder

我认为不需要您的 descriptor 字段。

与其携带nullable 字段,不如考虑编写两个类。一个是另一个的子类,一个可以容忍 null,另一个则不能。

Jakarta Bean 验证

对于 null 检查和限制字段大小等需求的更好解决方案是 Jakarta Bean Validation .参见 specification page ; Version 3是电流。参见 project page (有点过时了)。

一些 validator 是 provided .您可以编写自己的 validator 。

您可以在代码中调用 validator 。 validator 可以通过内置的用户界面调用 JavaFX或内置 Vaadin Flow .

我相信所提供的 validator NotNullSize 会实现您的目标。但 NotBlank 优于 NotNull,因为它还会检查非空文本是否包含至少一个非空白字符。

@NotBlank 
@Size( min=1 , max=10 )  
private String firstName ;

关于java - 在 Java 中,我将如何创建一个本质上是字符串子类但设置允许长度范围的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74441174/

相关文章:

编译时在代码中替换了 Java 静态最终值?

c++ - 如何从类中初始化数组并将值设置为第一个元素?

javascript - 如何从 Django 加载模型管理文件中的静态文件?

java - 无密码数字签名

java - 如何在项目中拥有字体并从 NetBeans IDE 中的项目文件夹中使用字体?

java - 关于Java中ArrayDeque的实现

java - 合并排序在复制步骤中抛出 ArrayOutOfBounds 错误?

javascript - AngularJS:多个工厂实例任何原型(prototype)继承

Java方法扩展而不是覆盖

java - 如何推断类型,其中返回类型也是方法参数的上限和下限