Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java .properties files as strongly typed classes

Is there way to get properties files as strongly typed classes? I guess there are code generators but doing it with annotations would be much cooler.

What I mean is;

foo.properties file
keyFoo = valuefoo
keyBar = valuebar

maybe with

@properties(file="foo.properties")
class foo { }

becomes

class foo {
  String getKeyFoo() { }
  String getKeyBar() { }
}

if not shall I start an open source project for that?

ADDITION TO QUESTION;

Think we have a foo.properties file with let say more than 10 entries; and think it is used as a simple configuration file. What I believe is that this configuration entries should be provided as a configuration class with related getXXX methods to other parts of the design. Then rest of the system accesses the configuration via provided class instead of dealing with key names and don't need to bother where configuration comes. Then you can replace this class with a mock when you are testing callers and dependency to file system goes away. On the other hand it is really nice to get all entries in a strongly typed fashion.

So this issue is a code generation issue behind the scenes, it is nothing related to runtime. But code generation with an external something instead of annotations didn't seemed nice to me. Although I am not very much familiar with annotations, I guess this could be achieved (but I'll keep in mind that annotations can not generate classes as McDowell points)

like image 928
yusuf Avatar asked Oct 16 '09 13:10

yusuf


People also ask

What is the use of .properties file?

properties is a file extension for files mainly used in Java-related technologies to store the configurable parameters of an application. They can also be used for storing strings for Internationalization and localization; these are known as Property Resource Bundles.

Is Java properties thread safe?

This class is thread-safe: multiple threads can share a single Properties object without the need for external synchronization.

What does ${ mean in a properties file?

The properties files are processed in the order in which they appear on the command line. Each properties file can refer to properties that have already been defined by a previously processed properties file, using ${varname} syntax.


2 Answers

There are countless of framework that achieve that for XML with various degree of configuration needed. The standard one bundled with Java is JaxB but it is not exactly a one liner xml persistence framework ...

The problem is that using properties file will only works better than XML (or JSON, ...) on the most trivial classes. When the class become a bit more complex, the properties file will become a nightmare. Another problem is that with trivial classes - there is not much difference between Xml and properties.

That means that the scope of the project will be rather limited. Mostly useful for project having loads of simple properties files.

In big application I worked with, strongly-type reading of properties file is done quite often using a simple factory-method.

 Foo foo = Foo.loadFrom("foo.properties");

 class Foo {
    static Foo loadFrom(String fileName) {
         Properties props = new Properties();
         props.load(...);

         Foo foo = new Foo();
         foo.setKeyFoo(props.get("KeyFoo"));
         ...
         return foo;
    }
   ...
 }
like image 58
vdr Avatar answered Oct 02 '22 09:10

vdr


There is a somewhat similar project for doing configuration as statically typed files. It requires to declare an interface, but it fills in the implementation itself:

public interface AppConfig extends Config {
    long getTimeout ();
    URL getURL ();
    Class getHandlerClass ();
}
like image 41
Avi Avatar answered Oct 02 '22 08:10

Avi