2016-10-17 4 views
2

J'utilise le mécanisme de vérification de zéro d'IntelliJ pour empêcher les plantages nullpointer. J'ai réussi à configurer tous les paramètres de la méthode Java pour qu'ils soient @NonNull par défaut en utilisant la réponse this. Après la création package-info.java est utilisé pour définir package annotations en Java. Tous les fichiers java qui sont des descendants directs de ce package ont des méthodes avec les paramètres @NonNull par défaut dans mon projet Android Studio.IntelliJ IDEA @ParametersAreNonnullByDefault pour tous les sous-packages

enter image description here

Le problème évident est que je dois définir @ParametersAreNonnullByDefault pour toutes les classes Java dans ce package à savoir y compris tous les sous-paquets.

Comment puis-je définir @ParametersAreNonnullByDefault afin qu'il se propage vers tous les fichiers java sous-package? Je souhaite que toute la méthode de mon code interne soit annotée avec @NonNull par défaut.

enter image description here

/** 
    * File: package-info.java 
    * Make all method parameters @NonNull by default 
    */ 
    @ParametersAreNonnullByDefault 
    package com.intive.nearbyplaces.main; 

    import javax.annotation.ParametersAreNonnullByDefault; 

Répondre

7

Le problème était que je ne pouvais pas forcer Android studio à respecter @ParametersAreNonnullByDefault dans tous les sous-paquets (c.-à-récursive pour tous les fichiers Java dans com.company.name)

J'ai écrit un gradle script, cependant, pour vérifier si package-info.java fichiers sont générés dans ea ch des sous-dossiers et créez-le si nécessaire. Le script s'exécute juste avant la tâche assembleDebug.

Il s'avère qu'il est possible de forcer @ParametersAreNonnullByDefault sur toutes les classes java de votre projet.

Télécharger la source here. N'oubliez pas de remplacer la ligne 19 par le nom de votre package.

Utilisation:

apply plugin: 'com.android.application' 
apply from: 'nonnull.gradle' 

android { 
    compileSdkVersion 24 
    buildToolsVersion "24.0.2" 

    [...] 
} 

Souvenez-vous d'inclure package-info.java fichiers dans .gitignore

//File: .gitignore 

package-info.java 

règle Checkstyle:

<module name="JavadocPackage"/> 

vérifie si package- info.java est inclus dans chaque sous-paquet.

Source:

/** 
* File: nonnull.gradle 
* 
* Generates package-info.java for appropriate packages 
* inside src/main/java folder. 
* 
* This is a workaround to define @ParametersAreNonnullByDefault for all Java classes in a package 
* i.e. including all subpackages (note: edit package name in line no. 19). 
*/ 
task generateNonNullJavaFiles(dependsOn: "assembleDebug", type: Copy) { 
    group = "Copying" 
    description = "Generate package-info.java classes" 

    def infoFileContentHeader = getFileContentHeader(); 
    def infoFileContentFooter = getFileContentFooter(); 

    def sourceDir = file("${projectDir}" + File.separatorChar + "src" + File.separatorChar + 
      "main" + File.separatorChar + "java" + File.separatorChar + 
      "com" + File.separatorChar + "company" + File.separatorChar + "name") 
    sourceDir.eachDirRecurse { dir -> 
     def infoFilePath = dir.getAbsolutePath() + File.separatorChar + "package-info.java" 

     if (!file(infoFilePath).exists()) { 
      def infoFileContentPackage = getFileContentPackage(dir.getAbsolutePath()); 
      new File(infoFilePath).write(infoFileContentHeader + 
        infoFileContentPackage + infoFileContentFooter) 
      println "[dir] " + infoFilePath + " created"; 
     } 
    } 
    println "[SUCCESS] NonNull generator: package-info.java files checked" 
} 

def getFileContentPackage(path) { 
    def mainSrcPhrase = "src" + File.separatorChar + "main" + File.separatorChar + 
      "java" + File.separatorChar 
    def mainSrcPhraseIndex = path.indexOf(mainSrcPhrase) 
    def output = path.substring(mainSrcPhraseIndex) 

    // Win hotfix 
    if (System.properties['os.name'].toLowerCase().contains('windows')) { 
     output = output.replace("\\", "/") 
     mainSrcPhrase = mainSrcPhrase.replace("\\", "/") 
    } 

    return "package " + output.replaceAll(mainSrcPhrase, "").replaceAll(
      "/", ".") + ";\n" 
} 

def getFileContentHeader() { 
    return "/** javadoc goes here \n */\n" + 
      "@ParametersAreNonnullByDefault\n" + 
      "@ReturnValuesAreNonnullByDefault\n" 
} 

def getFileContentFooter() { 
    return "\n" + 
      "import javax.annotation.ParametersAreNonnullByDefault;\n" + 
      "\n" + 
      "import edu.umd.cs.findbugs.annotations.ReturnValuesAreNonnullByDefault;" 
} 

version étendue qui génère des fichiers d'information de package pour principal src, le test & androidTest dossiers peuvent être trouvés here.

Findbugs & Lint:

Il ne fonctionne avec findbugs & peluches.