在构造函数中设置变量数组的最小大小

时间:2019-05-05 21:11:27

标签: java arrays kotlin constructor invariants

因此,我的程序设计教授希望我编写一个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个元素,但是我又该怎么做?

3 个答案:

答案 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批注类并实现所需的行为,使用反射来查找如此注释的字段名称,以便在消息中使用

我们称这种实现类型为“工程之上” ,但它可以正常工作。