我正在尝试创建一个新的对象类型,它的作用类似于 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
的类界面。 String
、StringBuilder
和其他一些类实现了该接口(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 NotNull
和 Size
会实现您的目标。但 NotBlank
优于 NotNull
,因为它还会检查非空文本是否包含至少一个非空白字符。
@NotBlank
@Size( min=1 , max=10 )
private String firstName ;
关于java - 在 Java 中,我将如何创建一个本质上是字符串子类但设置允许长度范围的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74441174/