简体   繁体   中英

Why can't I lazy-initialize static long array like this in java?

private static final long[] reservedFromIps;

static {
    reservedFromIps = {0l, 167772160l, 1681915904l, 
        2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l, 
        3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l}; 
}

The error is "illegal start of an expression, not a statement, ; expected"

whereas the following works fine :

private static final long[] reservedFromIps = {0l, 167772160l, 1681915904l, 
    2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l, 
    3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l}; 

This has nothing to do with static blocks, array constants can only be used in initializers. It's just how the language is specified.
This code wont compile either:

public class Test {
    public static void main(String[] args) {
        long[] reservedFromIps;
        reservedFromIps = {0l, 167772160l, 1681915904l, 
                2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l, 
                3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l}; 
    }
}

Why this is the case is probably a question of added complexity for the compiler with little added gain, but to be entirely sure you would have to take it up with the Java design team.

Firstly there's a typo in your static initializer block (or in your field declaration). Secondly you'll have to do this:

static {
        reservedFromIps = new long[]{0l, 167772160l, 1681915904l, 
            2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l, 
            3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l}; 
}

Array constants can only be used in initializers, and not when reassigning an array.

Java compiler cannot resolve type of your shorthand expression. Syntax requires type identifier before expression, no matter what is that expressions, type. An exception is made only for primitives and string. Array is not a primitive.

When used as an initializer, the innitializer expression type is already known - same as initialized variable type.

The declaration of the array type variable must go with the initialization in the same statement. Like long[] reservedFromIps = { /* ... */} . It's required by the syntactic sugar (by which we can initialize an array with just {} ).

eg the following should work -

static { 
    reservedFromIps = new long[] {0l, 167772160l, 1681915904l,  
    2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l,  
    3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l};  
}

The reason that the following

private static final long[] reservedFromIps = {0l, 167772160l, 1681915904l,  
    2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l,  
    3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l};  

works is because in that case, the declaration and initialization of the array reservedFromIps are in the same statement.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM