This is not allowed because you could call setA() through some other non-constructor method, which would later violate the final defense. Since final is a forced compilation operation, the compiler forces final to force initialization to occur in constructors or in strings.
In your simple example, everything looks good, but if you later updated your class to the next, the problem will become more obvious ...
public class FinalTest { private final Object a;
source share