3

[上下文:Java 新手,最多 4 个月;C++ 的老手。]

我正在开发一个库,该库在许多地方都需要一个固定大小的数组(“固定字符串”)。我正在尝试对这个特定问题使用依赖注入(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

4 回答 4

2

我不是 100% 确定你想要实现什么。防止构造函数被不同大小的数组调用?在编译时?为什么在运行时检查并抛出不是一个可接受的解决方案?

如果您的依赖注入框架支持新的bean 验证标准,那么这将使您在注入期间进行检查:

Foo(Bar injectedBar, @Size(min=5,max=5) char[] injectedFixedString)
于 2011-01-21T17:14:07.020 回答
2

确实没有办法用静态保证的长度来做你想做的事,除非你准备为每个长度都有一个新的类:FixedBarString4、FixedBarString5 等。(可以为单个链接的字符列表创建一个类使用泛型来编码长度。但我怀疑你是否愿意在现实世界的场景中使用它。

于 2011-01-21T17:01:33.110 回答
1

你不能java.lang.String在java程序中使用,并且只在需要时/如果需要将其转换为数组。使用toCharArray(), 并在此之前限制字符串(StringUtils.right(str, 5)例如,使用来自 commons-lang)

IllegalArgumentException或者,您可以在将长度超过 5 的字符串传递给该方法时抛出一个。

于 2011-01-21T17:04:00.850 回答
0

你可以有

Foo(Bar injectedBar, char[] injectedFixedString)

并调用它

new Foo(injectedBar, new char[5])

或者

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

还值得注意的是 char 是 2 个字节,而不是一个。您的协议是采用 16 位字符还是 8 位。

于 2011-01-21T17:00:59.180 回答