因此,我的程序设计教授希望我编写一个Kingdom类,其变量名称的长度至少为12个字符。 通常,只要使用最少12个字符的不变式来破坏此类,就可以使用String名称变量和一条错误消息来实现此类,在Java中是这样的:
import java.lang.annotation.AnnotationTypeMismatchException;
public class Kingdom {
private String name;
public String getName(){return name;}
public Kingdom(String name) {
if (name.length() < 12){
throw new IllegalArgumentException("name must have at least 12 characters");
}
this.name = name;
}
}
或科特林的那个
import java.lang.IllegalArgumentException
class KingdomName (name: String) {
public val name: String = if (name.length >= 12) name else throw IllegalArgumentException("name must have at least 12 characters")
}
但是我想知道是否有一种更优雅的方法,可以在变量名本身中定义“必须至少包含12个字符”不变式,这迫使我的教授像我们这样输入至少12个字符的名称所有人都必须将-2,147,483,648到2,147,483,647之间的整数分配给int / Int类型的变量。
现在,我考虑将我的名字设为char []数组,并在构造函数中只允许char数组长于或等于12,这在false-Java中是这样的:
public class Kingdom {
private char[] name;
public Kingdom(char[<=12] name) { //this line cannot exist in real Java
this.name = name;
}
}
但是有办法吗?
我还考虑发明一种新的名为KingdomName的类型,该类型与char []数组相同,但必须始终至少包含12个元素,但是我又该怎么做?
答案 0 :(得分:1)
我最好的想法之一就是将检查从构造函数移到一个单独的方法,该方法的名称描述内部逻辑。像这样:
private void validateHasAtLeast12chars(String toValidate)
将逻辑放入命名方法始终是一种好习惯,这既优雅又易于遵循。如果您有一个可以命名的逻辑,那么使用它自己的方法命名该逻辑就总是很优雅。
答案 1 :(得分:0)
好的,所以我找到了一种可以解决我的特定问题的策略,为每次创建王国实例创建最小字符数,并且在Java中是这样的:
public abstract class CustomTools {
public static char[] combineCharArrays(char[] array1, char[] array2){
// combines two char[] arrays into one with the combined length and returns the result
// no need to get too specific ;)
}
}
public class Kingdom {
private char[] name;
public char[] getName(){return name;}
public Kingdom(char nameChar1, char nameChar2, char nameChar3, char nameChar4, char nameChar5, char nameChar6, char nameChar7,
char nameChar8, char nameChar9, char nameChar10, char nameChar11, char nameChar12, char... restName) { //
char [] name = CustomTools.combineCharArrays(new char[] {nameChar1, nameChar2, nameChar3, nameChar4, nameChar5, nameChar6, nameChar7,
nameChar8, nameChar9, nameChar10, nameChar11, nameChar12}, restName);
this.name = name;
}
}
但是,这种实现方式很麻烦(不是一个字,使用Kingdom类的每个人都必须输入至少12个单个字符,并用逗号分隔),因此不太优雅,这违背了我的最初目标。 我还认为该代码背后的概念对于各种用例都不起作用或不合适。
因此,尚未找到该问题的真正答案。
答案 2 :(得分:0)
在“原始” java中,无法执行将消息绑定约束与消息的任何操作,但是您可以使用注释。
请注意,使用注释时,您不会避免任何代码,只需将其移至其他位置即可。
class Kingdom {
@MinLength(12)
private String name;
...
}
然后,您需要创建MinLength批注类并实现所需的行为,使用反射来查找如此注释的字段名称,以便在消息中使用
。我们称这种实现类型为“工程之上” ,但它可以正常工作。