O que vou mostrar funciona tanto em SE, ME, EE e se baseia no princípio de que uma variável estática final não pode ter seu valor alterado posteriormente.
Ela é estática para que possa ser referenciada pelas outras classes sem necessáriamente ser necessário instanciar um objeto do tipo da Classe que a contém.
Então fica assim, na classe-mestre, você coloca esta declaração que vai controlar se você quer código de debug sendo gerado na aplicação, durante a compilação ou não.
class Ambiente {
public static final boolean DEBUG = true;
}
Depois, é só ir espalhando o trecho abaixo onde você quer que seja executado o código válido somente para debugging:
if (Ambiente.DEBUG) {
.....
}
O que acontece na compilação é que o compilador verifique que a variável DEBUG é final e portanto não pode ser alterada e todos os trechos que referenciam a eles já podem ter seu valor determinado já no momento da compilação, ao contrário de uma variável não-final, que só dá para determinar em momento de execução.
Por exemplo, se deixarmos DEBUG = true, o compilador gerará no bytecode (JAR) o código dentro do IF, mas se deixarmos em false, ele não gerará não só o código que está dentro do IF como o próprio IF, já que não faz sentido de gerar bytecode para código que sempre vai falhar (DEBUG = false).
Esta técnica não é nova, não inventei e serve para várias coisas, por exemplo, quando vc quer compilar a aplicação para um determinado modelo de celular ou não quer gerar uma aplicação que usa uma determinada API.
A vantagem desta técnica em relação ao que existe no NETBEANS é que ela é independente de IDE.