Comment faire pour supprimer des instructions de débogage de la production de code en Java

StackOverflow https://stackoverflow.com/questions/32041

Question

Est-il possible pour le compilateur pour supprimer les énoncés utilisés à des fins de débogage (comme l'enregistrement) de la production de code?Les instructions de débogage aurait besoin d'être marqué d'une certaine façon, peut-être l'aide d'annotations.

Il est facile de définir une propriété (debug = true) et vérifier à chaque instruction de débogage, mais cela peut réduire les performances.Ce serait bien si le compilateur tout simplement les instructions de débogage disparaître.

Était-ce utile?

La solution

Deux recommandations.

D'abord: pour de vrai forestière, de l'utilisation moderne de la journalisation paquet comme log4j ou java est intégré dans l'exploitation forestière.Ne vous inquiétez pas au sujet de la performance autant, le niveau de journalisation de vérifier est de l'ordre de la nanoseconde.(c'est une comparaison des entiers).

Et si vous avez plus d'une seule instruction de journal, garde de l'ensemble du bloc:

(log4j, par exemple:)

if (logger.isDebugEnabled()) {

  // perform expensive operations
  // build string to log

  logger.debug("....");
}

Cela vous donne la possibilité de contrôle de l'exploitation forestière à l'exécution.Avoir à redémarrer et exécutez une version de débogage peut être très gênant.

Deuxième:

Vous pouvez trouver les assertions sont plus de ce que vous avez besoin.Une affirmation est une déclaration qui donne un résultat booléen, avec une option de message:

 assert (sky.state != FALLING) : "The sky is falling!";

Chaque fois que l'affirmation des résultats dans un faux, l'assertion échoue et un AssertionError est jeté contenant votre message (c'est un décoché exception, destiné à quitter l'application).

La chose intéressante est, elles sont traitées spécial par la JVM et peut basculé au moment de l'exécution vers le bas au niveau de la classe, à l'aide d'un paramètre VM (pas de recompiler nécessaire).Si pas activé, il n'y a pas de frais généraux.

Autres conseils

public abstract class Config
{
    public static final boolean ENABLELOGGING = true;
}

import static Config.*;

public class MyClass
{
    public myMethod()
    {
        System.out.println("Hello, non-logging world");

        if (ENABLELOGGING)
        {
            log("Hello, logging world.");
        }
    }
}

Le compilateur va supprimer le bloc de code avec "Bonjour, l'exploitation forestière mondiale." si ENABLE_LOGGING est défini à true, car c'est un statique de la valeur finale.Si vous utilisez un obfuscateur comme proguard, puis la Config de classe disparaîtront aussi.

Un obfuscateur permettrait aussi à des choses comme ça à la place:

public class MyClass
{
    public myMethod()
    {
        System.out.println("Hello, non-logging world");

        Log.log("Hello, logging world.");
    }
}

import static Config.*;

public abstract class Log
{
    public static void log(String s)
    {
        if (ENABLELOGGING)
        {
            log(s);
        }
    }
}

La méthode Log#journal le réduire à rien dans le compilateur, et sera éliminé par l'obfuscateur, ainsi que tous les appels à cette méthode et finalement, même le Journal de la classe elle-même être supprimé.

Une autre possibilité est de mettre l'instruction si au sein de votre fonction d'enregistrement, vous obtenez moins de code de cette façon, mais au détriment d'un peu plus d'appels de fonction.

Je suis également pas un grand fan de supprimer complètement le code de débogage.Une fois que vous êtes dans la production, vous aurez probablement besoin d'accéder à des messages de débogage si quelque chose va mal.Si vous supprimez tous vos codes de niveau de débogage, que ce n'est pas une possibilité.

Utilisation Java Préprocesseur?(google foo faible, mais c'est un lien vers le vieux Joël forums en discuter)

Java contient une sorte de préprocesseur de son propre.Il est appelé APT.Les processus et génère du code.Pour le moment, je ne suis pas sûr de savoir comment cela devrait fonctionner (je n'ai pas essayé).Mais il semble être utilisé pour ce genre de choses.

Je voudrais également vous recommandons vivement d'utiliser un de journalisation.

L' logger.IsDebugEnabled() n'est pas obligatoire, c'est juste qu'il peut être plus rapide pour vérifier si le système est dans le niveau de débogage avant l'enregistrement.

À l'aide d'une structure de journalisation signifie que vous pouvez configurer les niveaux d'enregistrement à la volée sans avoir à redémarrer l'application.

Vous pourriez avoir de la journalisation comme:

logger.error("Something bad happened")
logger.debug("Something bad happend with loads more detail")

Ce "astuce"semble faire vos instructions de débogage disparu

public static final boolean DEBUG = false;

if (DEBUG) { //disapeared on compilation }

L' post dit que javac est suffisamment intelligent pour vérifier la static final boolean et d'exclure les instructions de débogage.(Je n'ai pas personnellement essayer)

Pour l'enregistrement, personnellement, je ne voudrais voir un code comme:

if (logger.isDebugEnabled()) {
    logger.debug("....");
}
realImportantWork();

La journalisation des choses qui me déroute de l' realImportantWork().La bonne façon pour moi, c'est:

logger.debug("....");
realImportantWork()

en plus de la config qui exclut tous les messages de débogage sur la Production.

Je veux dire que la logger.isDebugEnabled() le contrôle doit être le travail de la journalisation, pas mon métier.La plupart de journalisation des concepts de soutien comme "logger", "LogLevel"..qui peut faire l'affaire.

Pour répondre directement à votre question:Je ne sais pas.

Mais voici une autre solution à votre problème:Dans mon esprit, il y a deux états qui entrent en collision les uns avec les autres ici:"des instructions de débogage" et "code de production".

Quel est le but des instructions de débogage?Aide à se débarrasser des punaises de tout (unité) de test.Si un morceau de logiciel est correctement testé et fonctionne selon les besoins, des instructions de débogage ne sont rien d'autre mais OBSOLÈTE.

Je suis en total désaccord avec tout en laissant des instructions de débogage dans le code de production.Je parie que personne ne dérange les tests des effets secondaires de débogage de code dans le code de production.Le code n'est probablement qu'il est censé faire, mais faut-il faire de plus?Pour toutes vos #définit le travail correctement et vraiment prendre TOUT le débogage de code?Qui analyse 100000 lignes de pré-traitées code pour voir si tout le débogage des choses est allé?

À moins que nous avons une définition différente de la production de code, vous devriez envisager de prendre les instructions de débogage après le code est testé et être fait avec elle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top