установить минимальный размер массива переменных в конструкторе - PullRequest
2 голосов
/ 06 мая 2019

Итак, мой профессор по программированию хочет, чтобы я написал класс Kingdom с именем переменной длиной не менее 12 символов.Обычно этот класс можно реализовать с помощью переменной String name и сообщения об ошибке, если инвариант длиной не менее 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;
    }

}

или в Kotlin:

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.в конструкторе, что-то вроде этого в поддельной 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 ]

1 голос
/ 06 мая 2019

Одной из моих лучших идей было бы просто перенести проверку из конструктора в отдельный метод с именем, описывающим логику внутри.Примерно так:

private void validateHasAtLeast12chars(String toValidate)

Использование логики в именованном методе - это всегда хорошая практика, это одновременно элегантно и просто.Если у вас есть логика, которая может быть названа, то это всегда элегантно, если она находится в собственном методе с этим именем.

0 голосов
/ 06 мая 2019

Нет способа сделать то, что вы хотите, а именно привязать ограничение с сообщением к полю в «сырой» java, но вы можете использовать аннотации.

Обратите внимание, что при использовании аннотаций вы не избегаете какого-либо кода, вы просто перемещаете его в другое место.

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

    ...
}

Затем вам нужно будет создать класс аннотаций MinLength и реализовать желаемое поведение, используя отражение, чтобы узнать имя поля, аннотированного для использования в сообщении.

Мы называем этот тип реализации сверх проектирования , но это будет работать.

0 голосов
/ 06 мая 2019

ОК, поэтому я нашел стратегию, которая работает для моей конкретной проблемы, устанавливая минимальное количество символов для каждого случая, когда создается экземпляр Kingdom, и в 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 одинарных символов, разделенных запятыми) и, следовательно, не очень элегантный, бросая вызов моей первоначальной цели.Я также представляю себе, что концепция этого кода не работает или не подходит для различных вариантов использования.

Так что реального ответа на этот вопрос еще не найдено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...