所有子包的IntelliJ IDEA @ParametersAreNonnullByDefault
我使用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;
问题是我不能强迫Android Studio在所有子包中尊重@ParametersAreNonnullByDefault (即递归地为com.company.name中的所有java文件)
但是,我编写了一个gradle脚本来检查是否在每个子包文件夹中生成了package-info.java文件,并在必要时创建它。 该脚本在assembleDebug任务之前运行。
因此事实certificate,可以对项目中的所有Java类强制使用@ParametersAreNonnullByDefault注释。
在这里下载源代码。 请记住用您的包名替换第19行。
用法:
apply plugin: 'com.android.application' apply from: 'nonnull.gradle' android { compileSdkVersion 24 buildToolsVersion "24.0.2" [...] }
请记住在.gitignore中包含package-info.java文件
//File: .gitignore package-info.java
Checkstyle规则:
检查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 * ie 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;" }
可以在此处找到为src main,test和androidTest文件夹生成包信息文件的扩展版本。
Findbugs&Lint:
它确实适用于findbugs和lint。
- 如何从android studio中的库模块调用活动
- 在gradle更新后无法找到方法(无法编译项目)
- Gradle sync失败:对于输入字符串:“+”
- 在Android Studio中添加新模块时出现java.lang.NoClassDefFoundError:android.support.v4.app.NavUtilsJB错误
- 模拟器:glClear:466 GL err 0x502
- AndroidStudio升级到1.0(12月8日)后的NoClassDefFoundError
- RecyclerView与ImageView和不同的活动
- 无法编辑外部库文件 – 在Android Studio中显示为已锁定
- 在pagerAdapter中的片段之间发送数据