Squants: The Scala API for Quantities, Units of Measure and Dimensional Analysis
squants.com
squants.com
Daniel Spiewak discusses problems and design considerations which arise when dealing with multiple data that must work together in the same function- which is to say most functions.
@Currency("USD") double amount;
These annotations can be checked automatically using a compiler plug-in, such as the Checker Framework [1]. The Checker Framework comes pre-packaged with a units checker [2] along with checkers for null pointer errors, locks, string formatting, security, and many more.
Java's domain-specific language (DSL) features aren't as rich as Scala's. However, you could implement some DSL-like features using aspect-oriented programming (AOP) tools or other similar compiler plug-ins.
[1] http://types.cs.washington.edu/checker-framework/ [2] http://types.cs.washington.edu/checker-framework/current/che...
Given the choice I always pick Scala over Java. Maintaining legacy Java code with AspectJ, Lombok and other behind-your-back bytecode manipulations are literally the bane of my existence.
Using plug-ins for automated analysis improves the quality of your codebase. The annotations serve as a machine-checked documentation which make the code easier to debug.
As you point out though, the benefits of plug-ins for metaprogramming (such as implementing a DSL) is not always as clear-cut: you have to pay the price of maintenance, much of which is not always obvious up-front.
You face many of the same issues when designing a DSL in Scala --- the DSL may generate code that depends on a custom run-time or library.