Yesterday I pushed a blog entry about my experience with the Locale class in Java 7. As I experimented with the class, I discovered a new category enumeration:
I learned some more about the
Locale.setDefault methods that indicate a user error on my part. I stated that
ResourceBundle is tied to the
DISPLAY default locale. I made this assumption because all the Format subclasses do use the
FORMAT category’s default locale setting. I inferred that
ResourceBundle would do something similar — that it would use the
DISPLAY default locale. It just isn’t true.
In some ways Java 7 has introduced the concept of 3 separate Locale categories: the two above and a system-wide category. It turns out that
Locale.setDefault(aLocale) will reset both the
FORMAT defaults to the system-wide locale. However, a call to
Locale.setDefault(Category.DISPLAY, anotherLocale) does not affect the system-wide locale.
It is interesting to note that various
Format subclasses will use the
FORMAT default locale if you don’t explicitly use a locale param in the their
getInstance methods. Surprisingly (to me however), the
ResourceBundle.getBundle method does NOT use the
DISPLAY locale when you don’t provide an explicit locale parameter; it uses the system-wide default locale that was set at startup or the locale you’ve set with
So there you have it. My mistake. Hope this helps clarify.
Now that I’ve described the current behavior, I do have an opinion on this. For what it’s worth, my opinion is this: if the system default locale is used by
ResourceBundle.getBundle, then other locale-sensitive classes should also use the system-wide default when you don’t explicitly provide a locale in their creation methods. The difference in how locale-sensitive classes use a default locale is confusing in its current Java 7 state. All methods that use a default locale instance should probably use the system-wide locale default.
Oh, and one other thing… If you’re going to have Locale “Categories”, you might as well introduce another:
Locale.Category.SYSTEM. When you call
Locale.setDefault(ALL, aLocale), I would hope that the call would set the default for all other categories that exist now and in the future. Yes, I do realize that a call to
Locale.setDefault(aLocale) already resets all the other category defaults, but for consistency’s sake, we need a
Category.ALL. My argument for this is simple: it’s consistent and as a user I just expected to see it. When I didn’t, I became confused. I wrote some demo code, and it didn’t work as expected. Yes, it’s user error, but I just know some of you will make the same error if you haven’t already read about the differences here.