所有子包的 IntelliJ IDEA @ParametersAreNonnullByDefault [英] IntelliJ IDEA @ParametersAreNonnullByDefault for all subpackages

查看:39
本文介绍了所有子包的 IntelliJ IDEA @ParametersAreNonnullByDefault的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 IntelliJ 的空检查机制来防止空指针崩溃.我已经使用

明显的问题是我需要为该包中的所有 Java 类定义 @ParametersAreNonnullByDefault,即包括所有子包.

我如何定义 @ParametersAreNonnullByDefault 以便它向下传播到所有子包 java 文件?默认情况下,我希望所有内部代码的方法都使用@NonNull 进行注释.

/*** 文件:package-info.java* 使所有方法参数默认为@NonNull*/@ParametersAreNonnullByDefault包 com.intive.nearbyplaces.main;导入 javax.annotation.ParametersAreNonnullByDefault;

解决方案

问题是我无法强制 Android Studio 在所有子包中尊重 @ParametersAreNonnullByDefault(即递归所有 java 文件com.company.name)

我写了一个 gradle 脚本,但是,检查 package-info.java 文件是否在每个子包文件夹中生成并在必要时创建它.该脚本在 assembleDebug 任务之前运行.

所以事实证明可以在项目中的所有 Java 类上强制使用 @ParametersAreNonnullByDefault 注释.

此处下载源代码.请记住将第 19 行替换为您的包名称.

用法:

应用插件:'com.android.application'申请自:'nonnull.gradle'安卓 {compileSdkVersion 24构建工具版本24.0.2"[...]}

记得在 .gitignore

中包含 package-info.java 文件

//文件:.gitignore包信息.java

Checkstyle 规则:

检查每个子包中是否包含 package-info.java.

来源:

/*** 文件:nonnull.gradle** 为适当的包生成 package-info.java* 在 src/main/java 文件夹中.** 这是为包中的所有 Java 类定义 @ParametersAreNonnullByDefault 的解决方法* 即包括所有子包(注意:在第 19 行编辑包名称).*/任务 generateNonNullJavaFiles(dependsOn: "assembleDebug", type: Copy) {group = "复制"description = "生成 package-info.java 类"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"如果 (!file(infoFilePath).exists()) {def infoFileContentPackage = getFileContentPackage(dir.getAbsolutePath());新文件(infoFilePath).write(infoFileContentHeader +infoFileContentPackage + infoFileContentFooter)println "[dir] " + infoFilePath + " created";}}println "[SUCCESS] NonNull 生成器: package-info.java 文件已检查"}def getFileContentPackage(path) {def mainSrcPhrase = "src" + File.separatorChar + "main" + File.separatorChar +"java" + File.separatorChardef mainSrcPhraseIndex = path.indexOf(mainSrcPhrase)def output = path.substring(mainSrcPhraseIndex)//赢得修补程序if (System.properties['os.name'].toLowerCase().contains('windows')) {output = output.replace("\\", "/")mainSrcPhrase = mainSrcPhrase.replace("\\", "/")}返回包"+ output.replaceAll(mainSrcPhrase,").replaceAll("/", ".") + ";\n"}def getFileContentHeader() {return "/** javadoc 在这里\n */\n" +"@ParametersAreNonnullByDefault\n" +"@ReturnValuesAreNonnullByDefault\n"}def getFileContentFooter() {返回 "\n" +"导入 javax.annotation.ParametersAreNonnullByDefault;\n" +"\n" +导入edu.umd.cs.findbugs.annotations.ReturnValuesAreNonnullByDefault;"}

为 src main、test & 生成包信息文件的扩展版本androidTest 文件夹可以在此处找到.

Findbugs &皮棉:

确实可以使用 findbugs &棉绒.

I use IntelliJ's null-checking mechanism to prevent nullpointer crashes. I've successfully set up all Java method parameters to be @NonNull by default using this answer.

After creating package-info.java which is used to define package annotations in Java. All java files which are direct descendants of that package have methods with default @NonNull parameters in my Android Studio project.

The obvious problem is that I need to define @ParametersAreNonnullByDefault for all Java classes in that package i.e. including all subpackages.

How can I define @ParametersAreNonnullByDefault so that it propagates down to all subpackage java files? I want to have all of my internal code's method annotated with @NonNull by default.

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

  import javax.annotation.ParametersAreNonnullByDefault;

解决方案

The problem was that I couldn't force Android Studio to respect @ParametersAreNonnullByDefault in all subpackages (i.e. recursively for all java files in com.company.name)

I wrote a gradle script, however, to check whether package-info.java files are generated inside each of the subpackage folders and create it if necessary. The script runs just before assembleDebug task.

So it turns out it is possible to force @ParametersAreNonnullByDefault annotation on all java classes in your project.

Download the source here. Remember to replace line 19 with your package name.

Usage:

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

android {
   compileSdkVersion 24
   buildToolsVersion "24.0.2"

   [...]
}

Remember to include package-info.java files in .gitignore

//File: .gitignore 

package-info.java

Checkstyle rule:

<module name="JavadocPackage"/>

checks whether package-info.java is included in each subpackage.

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;"
}

Extended version which generates package info files for src main, test & androidTest folders can be found here.

Findbugs & Lint:

It does work with findbugs & lint.

这篇关于所有子包的 IntelliJ IDEA @ParametersAreNonnullByDefault的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆