kos*_*cki 5 java nullable intellij-idea non-nullable android-studio
我使用IntelliJ的空检查机制来防止nullpointer崩溃.我已经使用此答案成功将所有Java方法参数设置为@NonNull .
创建package-info.java之后,用于在Java中定义包注释.作为该包的直接后代的所有java文件都具有在我的Android Studio项目中具有默认@NonNull参数的方法.
显而易见的问题是我需要为该包中的所有Java类定义@ParametersAreNonnullByDefault,即包括所有子包.
如何定义@ParametersAreNonnullByDefault以便它传播到所有子包java文件?我想默认使用@NonNull注释我的所有内部代码方法.
/**
* File: package-info.java
* Make all method parameters @NonNull by default
*/
@ParametersAreNonnullByDefault
package com.intive.nearbyplaces.main;
import javax.annotation.ParametersAreNonnullByDefault;
Run Code Online (Sandbox Code Playgroud)
问题是我不能强迫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
buildToolsVersion "24.0.2"
[...]
}
Run Code Online (Sandbox Code Playgroud)
请记住在.gitignore中包含package-info.java文件
//File: .gitignore
package-info.java
Run Code Online (Sandbox Code Playgroud)
Checkstyle规则:
<module name="JavadocPackage"/>
Run Code Online (Sandbox Code Playgroud)
检查package-info.java是否包含在每个子包中.
资源:
/**
* 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;"
}
Run Code Online (Sandbox Code Playgroud)
可以在此处找到为src main,test和androidTest文件夹生成包信息文件的扩展版本.
Findbugs&Lint:
它适用于findbugs和lint.
| 归档时间: |
|
| 查看次数: |
1293 次 |
| 最近记录: |