Альтернатива массивам фиксированного размера в Java? - PullRequest
3 голосов
/ 21 января 2011

[ Контекст: новинка для Java, 4 месяца вершин;Старая рука в C ++. ]

Я работаю над библиотекой, которая требует массив фиксированного размера ("фиксированная строка") во многих местах.Я пытаюсь использовать Dependency Injection (qv) для этой конкретной проблемы, поэтому я хотел бы что-то вроде:

class Foo 
{
    private Bar injectedBar;
    private char[] injectedFixedString;

    Foo(Bar injectedBar, /* what can go here? */ char[5] injectedFixedString);
    { /* initializing code goes here /* }
}

Требуется просто - это входит в автоматически генерируемый протокол связи.У меня нулевой контроль над протоколом и базой данных, из которых он получен;У меня будет сотни, если не тысячи, этих экземпляров в конечном коде.Итак, учитывая все это:

Является ли моя единственная альтернатива C ++:

char injectedFixedString[5];

для создания собственного класса?Что-то вроде:

class FixedBarString {
    /* could also set this in the constructor, but this complicates code generation a tad */
    public static integer STRING_SIZE = 5; /* string size */
    char[] fixedString = new char[STRING_SIZE];

    FixedBarString(char[] string) throws RuntimeException {
      /* check the string here; throw an exception if it's the wrong size.
         I don't like constructors that throw however. */
    }

    public void setString(char[] string) throws RuntimeException {
      /* check the string here */
    }

    public char[] getString() {
      /* this isn't actually safe, aka immutable, without returning clone */
    }

    public char[] createBlankString() {
      return new char[STRING_SIZE];
    }
}

Спасибо.(Мои извинения, если это слишком много кода).

Ответы [ 4 ]

2 голосов
/ 21 января 2011

Я не уверен на 100%, чего ты хочешь достичь. Предотвратить вызов конструктора с массивом другого размера? Во время компиляции? Почему проверка и сброс во время выполнения не являются приемлемым решением?

Если ваша инфраструктура внедрения зависимостей поддерживает новый стандарт проверки bean , тогда вы получите проверку во время внедрения:

Foo(Bar injectedBar, @Size(min=5,max=5) char[] injectedFixedString)
2 голосов
/ 21 января 2011

Действительно нет способа сделать то, что вы хотите, с статически гарантированной длиной , если вы не готовы иметь новый класс для каждой длины: FixedBarString4, FixedBarString5 и т. Д. (Можно создатькласс для единого связанного списка символов, который использует обобщенные значения для кодирования длины, но я сомневаюсь, что вы хотели бы использовать это в сценарии реального мира.

1 голос
/ 21 января 2011

Разве вы не можете использовать java.lang.String в java-программе и конвертировать ее в массив только когда / при необходимости.Использование toCharArray() и ограничение строки до этого (например, StringUtils.right(str, 5) из commons-lang)

Или вы можете выбросить IllegalArgumentException, когда строка длиной более 5 передаетсяметод.

0 голосов
/ 21 января 2011

Вы можете иметь

Foo(Bar injectedBar, char[] injectedFixedString)

и позвоните по номеру

new Foo(injectedBar, new char[5])

или

Foo(Bar injectedBar, fixedStringLength)
new Foo(injectedBar, 5)

также стоит отметить, что char - это 2 байта, а не один. Ваш протокол принимает 16-битные или 8-битные символы.

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