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

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

问题描述

我使用IntelliJ的空检查机制来防止nullpointer崩溃。
我已经使用



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



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



  / ** 
*文件:package-info.java
*默认设置所有方法参数@NonNull
* /
@ParametersAreNonnullByDefault
package com.intive.nearbyplaces.main;

import javax.annotation.ParametersAreNonnullByDefault;


解决方案

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



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



因此事实证明,可以对项目中的所有java类强制执行 @ParametersAreNonnullByDefault 注释。



下载源此处。请记住用您的包裹名称替换第19行。



用法:

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

android {
compileSdkVersion 24
buildToolsVersion24.0.2

[...]
}

请记住在 .gitignore

中包含 package-info.java 文件

  //文件:.gitignore 

package-info.java

Checkstyle规则:

 < module name =JavadocPackage/> 

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



资料来源:

  / ** 
*档案:nonnull.gradle
*
*为src / main / java文件夹中的适当包
*生成package-info.java。
*
*这是为
*包中的所有Java类定义@ParametersAreNonnullByDefault的解决方法,即包括所有子包(注意:编辑第19行中的包名)。
* /
任务generateNonNullJavaFiles(dependsOn:assembleDebug,类型:复制){
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

if(!file(infoFilePath).exists()){
def infoFileContentPackage = getFileContentPackage(dir.getAbsolutePath());
new File(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.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(\\,/)
}

返回package+ output.replaceAll(mainSrcPhrase,)。replaceAll(
/,。)+; \ n
}

def getFileContentHeader(){
return/ ** javadoc go here \ n * / \ n+
@ ParametersAreNonnullByDefault\\\
+
@ReturnValuesAreNonnullB yDefault \ n
}

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

为src main,test&生成包信息文件的扩展版本androidTest文件夹可以在这里找到。



Findbugs& Lint:



确实有效与findbugs& lint。


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天全站免登陆