I think the results of inheriting the anti-pattern constants interfaces versus using the interface directly will be the same. Inheriting itself doesn't imply copying. I think what whereever you *use* a constant, there may be constant folding, but that doesn't take up space and in fact may save in both space and time as it facilittates further optimization.
On the other hand, good OOD would suggest that if these constants are global and not associated with any one class
you should define them in a class:
If you don't like writing AppConstants.MAX elsewhere, you can use
static imports.
Client code still will probably fold in constants at compile time. You can
test that with the following program: run C, edit and compile only AppConstants and run C again.
To avoid this behavior (to make it easier to recompile and run, versus any worries of runtime size), you can write the constant class as follows.