views:

222

answers:

3

Hello all,

I am facing a use case where I would like to declare a static finalfield with an initializer statement that is declared to throw a checked exception. Typically, it'd look like this:

public static final ObjectName OBJECT_NAME = new ObjectName("foo:type=bar");
The issue I have here is that the `ObjectName` constructor may throw various checked exceptions, which I don't care about (because I'd know my name is valid, and it's allright if it miserably crashes in case it's not). The java compiler won't let me just ignore this (as it's a checked exception), and I would prefer not to resort to:
public static final ObjectName OBJECT_NAME;
static{
    try{
        OBJECT_NAME = new ObjectName("foo:type=bar");
    }catch(final Exception ex){
        throw new RuntimeException("Failed to create ObjectName instance in static block.",ex);
    }  
}

Because static blocks are really, really difficult to read. Does anyone have a suggestion on how to handle this case in a nice, clean way?

+3  A: 

static blocks aren't difficult to read. So I'd recommend that solution. However, you can wrap your object in another object, for example ObjectNameWrapper which shares an interface with your ObjectName, and whose constructor calls your ObjectName constructor, hiding all checked exceptions that occur. But again, I'd go for the static option.

Bozho
Introducing another object seem obtuse.
Tom Hawtin - tackline
I certainly agree with you. Your static method suggestion is way better.
Bozho
+5  A: 

Your code is perfectly valid. I don't find it difficult to read. Other ways would only make it more worse. They're only difficult to read for starters, because most of them are not familiar with that. Just follow the standard conventions with regard to ordering of the elements in the code. E.g. do not put static initializers halfway or at the whole bottom of the code and also do not have multiple of them spreading over the class. Just put one at top, after static declarations.

BalusC
This is a very valid point (so I voted it up despite not accepting it), ant the GPP is also best stated. I won't use that method because as you say, this is only difficult to understand/read for beginners... And I can't ensure the people who'll maintain it after me are experienced :).
Romain
I am not sure if I would prefer that. With refactoring it into a `private static` method you risk losing the oversight. Normal practice is that those kind of methods (utility methods) are placed at the whole bottom of the class. But OK, nowadays you have IDE's so that you can just click ahead.
BalusC
+5  A: 

If you don't like static blocks (some people don't) then an alternative is to use a static method. IIRC, Josh Bloch recommends this in Effective Java.

public static final ObjectName OBJECT_NAME = createObjectName("foo:type=bar");
private static ObjectName createObjectName(final String name) {
    try {
        return new ObjectName(name);
    } catch (final SomeException exc) {
        throw new Error(exc);
    }  
}

Or:

public static final ObjectName OBJECT_NAME = createObjectName();
private static ObjectName createObjectName() {
    try {
        OBJECT_NAME = new ObjectName("foo:type=bar");
    } catch (final SomeException exc) {
        throw new Error(exc);
    }  
}
Tom Hawtin - tackline
I didn't think about it, despite now that I read it I'm 100% certain I've used this approach a long time ago. I'll use this as I don't like static blocks and also like my code to be readable by beginners (You never know who'll maintain you code after yourself :)).
Romain