Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在构造函数中设置变量数组的最小大小_Java_Arrays_Kotlin_Constructor_Invariants - Fatal编程技术网

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

Java 在构造函数中设置变量数组的最小大小,java,arrays,kotlin,constructor,invariants,Java,Arrays,Kotlin,Constructor,Invariants,因此,我的编程教授希望我编写一个至少有12个字符长的变量名的Kingdom类。 通常情况下,如果min的12个字符的不变量被破坏,则只需使用一个字符串名变量和一条错误消息来实现该类,在Java中是这样的: import java.lang.annotation.AnnotationTypeMismatchException; public class Kingdom { private String name; public String getName(){return na

因此,我的编程教授希望我编写一个至少有12个字符长的变量名的Kingdom类。 通常情况下,如果min的12个字符的不变量被破坏,则只需使用一个字符串名变量和一条错误消息来实现该类,在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;
    }

}

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 ;)
    }
}
但我想知道是否有一个更优雅的路径,在这个路径中,“必须至少有12个字符”不变量可以在变量名本身中定义,迫使我的教授为名称输入至少12个字符,就像我们都被迫将-2147483648到2147483647之间的整数分配给int/int类型的变量一样

现在我考虑将我的名字命名为char[]数组,并且在构造函数中只允许char数组的长度大于或等于12,在伪Java中类似于这样:

public class Kingdom {

    private char[] name;

    public Kingdom(char[<=12] name) {   //this line cannot exist in real Java
        this.name = name;
    }
}
公共类王国{
私有字符[]名称;

public Kingdom(char[我最好的想法之一是将检查从构造函数移动到一个单独的方法,该方法的名称描述了其中的逻辑。类似如下:

private void validatehastleast12chars(字符串toValidate)


将逻辑放入命名方法始终是一种很好的做法,这既优雅又容易遵循。如果您有一个可以命名的逻辑,那么如果它在自己的方法中使用该名称,则它总是优雅的。

好的,所以我找到了一种适用于我的特定问题的策略,为实例建立最小字符数一个王国的未来将被创造,在爪哇是这样的:

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;
    }

}

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 ;)
    }
}
但是,这个实现非常繁琐(使用Kingdom类的每个人都必须输入至少12个字符,除以逗号,而不是一个单词),因此不是非常优雅,这违背了我最初的目标。 我还认为此代码背后的概念不起作用或不适合各种用例


因此,这个问题的真正答案还没有找到。

在“原始”java中,没有办法做您想要做的事情,也就是将带有消息的约束绑定到字段,但您可以使用注释

请注意,在使用注释时,您不会回避任何代码,而是将其移动到其他地方

class Kingdom {
    @MinLength(12)
    private String name;

    ...
}
然后,您需要创建MinLength注释类并实现所需的行为,使用反射查找要在消息中使用的注释字段的名称


我们将这种类型的实现称为工程,但它会起作用。

抛出异常可能是最好的选择。即使您接受了
char[]
,有人仍然可以传递少于12个元素的数组。您可能想看看。我已经链接到了一节,该节将为您提供如何实现它的详细信息。感谢@Sindbad90的建议,下次在一个严肃的项目中遇到这个问题时,我一定会研究Hibernate验证器。但是为了这个任务此外,从互联网下载外部库也不是一个选项。不过,我确实找到了另一种安全但不太优雅的方法,让我的教授单独键入字符,从而在构造函数中实现最小名称长度12。代码大约有200个字母太长,无法作为注释发布,尽管这是唯一的答案(到目前为止)它在编译时强制执行12个字符的限制,这是我认为提问者的目标。虽然,正如你所说,它非常具体,一点也不实用,我真的不想在生产代码中看到它。。。