1、背景

最近在负责公司基础业务和移动基础设施的开发工作,正在负责Lint代码静态检查工作。因此编写了自定义的Lint规则,在编写自定义的Lint规则前,当然是需要去把Google的关于Lint检测的源代码看一遍学习学习如何编写自定义规则。

google官方的lint源代码链接为:
https://android.googlesource.com/platform/tools/base/+/master/lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks?spm=5176.100239.blogcont6918.10.MXIr5J

我的github上备份了该源代码:
https://github.com/ouyangpeng/android-lint-checks

在看源代码的过程中,我发现一些奇怪的注释//$NON-NLS-1$,这个注释到底是什么意思呢?

 /** Using a view inflater unconditionally in an AdapterView */public static final Issue ISSUE = Issue.create("ViewHolder", //$NON-NLS-1$"View Holder Candidates","When implementing a view Adapter, you should avoid unconditionally inflating a " +"new layout; if an available item is passed in for reuse, you should try to " +"use that one instead. This helps make for example ListView scrolling much " +"smoother.",Category.PERFORMANCE,5,Severity.WARNING,IMPLEMENTATION).addMoreInfo("http://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder");private static final String GET_VIEW = "getView";  //$NON-NLS-1$static final String INFLATE = "inflate";           //$NON-NLS-1$

除了上面的//$NON-NLS-1$注释之外,还有类似于 //$NON-NLS-2$//$NON-NLS-3$的注释,如下所示:

    /* (non-Javadoc)* @see javax.lang.model.util.Types#contains(javax.lang.model.type.TypeMirror, javax.lang.model.type.TypeMirror)*/@Overridepublic boolean contains(TypeMirror t1, TypeMirror t2) {switch(t1.getKind()) {case EXECUTABLE :case PACKAGE :throw new IllegalArgumentException("Executable and package are illegal argument for Types.contains(..)"); //$NON-NLS-1$default:break;}switch(t2.getKind()) {case EXECUTABLE :case PACKAGE :throw new IllegalArgumentException("Executable and package are illegal argument for Types.contains(..)"); //$NON-NLS-1$default:break;}throw new UnsupportedOperationException("NYI: TypesImpl.contains(" + t1 + ", " + t2 + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$}

反正看了下代码,基本上所有的使用字符串的地方,后面都会接上这么一个注释,//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$。那么 这个 //$NON-NLS-1$ 到底是什么意思呢?

2、//$NON-NLS-1$的意义

参考了网上的资料,
查看了stackoverflow上的一个提问,下面是链接:

https://stackoverflow.com/questions/654037/what-does-non-nls-1-mean

原文解释如下:

They silence a warning that Eclipse emits when it encounters string literals (and has been configured to complain).

The idea is that UI messages should not be embedded as string literals, but rather sourced from a resource file (so that they can be translated, proofed, etc). Consequently, Eclipse can be configured to detect string literals, so that you don’t accidentally have leave unexternalized UI strings in the code; however, there are strings which should not be externalized (such as regexps) and so, //NONNLS1 gives you a way to communicate that fact to the compiler.

使用Google翻译内容如下:

当它遇到字符串文字(并已被配置为抱怨)时,它们会使Eclipse发出警告。

这个想法是,UI消息不应该嵌入字符串文字,而是从资源文件中获取(以便可以翻译,校对等)。因此,Eclipse可以配置为检测字符串文字,这样您就不会意外地在代码中留下无用的UI字符串;但是,有些字符串不应该被外部化(如regexps),所以// $ NON-NLS-1 $给你一个方法来将该事实传递给编译器。

查看链接:
http://www.eeworm.com/read/185704/8990379/3/

里面有一段注释对// $ NON-NLS-1 $进行了描述,如下所示:

描述内容为:

The string $NON-NLS-1$ is a hint for both the compiler =
and the=20
Externalization wizard that the first character string on this line is a =
tag or=20
keyword of some sort and should not be localized.

大概含义就是:

$NON-NLS-1$表明本行的第一个string型变量是一个标签或者关键字,不需要被本地化。

参考链接:
http://www.eclipse.org/articles/Article-Internationalization/how2I18n.html

里面举了一个例子,如下所示:

总结一下:使用了//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$的含义就是告诉Eclipse等IDE软件,该字符串不需要被本地化操作。

3、参考链接

  • https://android.googlesource.com/platform/tools/base/+/master/lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks?spm=5176.100239.blogcont6918.10.MXIr5J

  • https://github.com/ouyangpeng/android-lint-checks

  • https://stackoverflow.com/questions/654037/what-does-non-nls-1-mean

  • http://www.eeworm.com/read/185704/8990379/3/

  • http://blog.csdn.net/mr_yanfei/article/details/47271

  • https://ask.helplib.com/101812

  • http://www.cnblogs.com/DreamDrive/p/4234587.html

  • http://www.eclipse.org/articles/Article-Internationalization/how2I18n.html

  • https://gxnotes.com/article/21368.html


作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:http://blog.csdn.net/ouyang_peng/article/details/77941890

如果觉得本文对您有所帮助,欢迎您扫码下图所示的支付宝和微信支付二维码对本文进行随意打赏。您的支持将鼓励我继续创作!

【我的Android进阶之旅】Android 源代码中的Java代码中//$NON-NLS-1$ 注释是什么意思?...相关推荐

  1. 我的Android进阶之旅------Android利用Sensor(传感器)实现水平仪功能的小例

    这里介绍的水平仪,指的是比较传统的气泡水平仪,在一个透明圆盘内充满液体,液体中留有一个气泡,当一端翘起时,该气泡就会浮向翘起的一端.    利用方向传感器返回的第一个参数,实现了一个指南针小应用.   ...

  2. 我的Android进阶之旅------Android利用温度传感器实现带动画效果的电子温度计

    要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...

  3. android服务进阶,我的Android进阶之旅------Android服务的生命周期回调方法

    先引用一段官网上的文字 ======================================================================================== ...

  4. 我的Android进阶之旅------Android项目目录结构分析

    此文章来自"博客园"博主,仅在此借鉴,学习 1.HelloWorld项目的目录结构 1.1.src文件夹 1.2.gen文件夹 1.3.Android 2.1文件夹 1.4.ass ...

  5. 我的Android进阶之旅------Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能...

    前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...

  6. 我的Android进阶之旅------Android二级ListView列表的实现

    实现如下图所示的二级列表效果 首先是在布局文件中,布局两个ListView,代码如下: <LinearLayout xmlns:android="http://schemas.andr ...

  7. 我的Android进阶之旅------Android Studio 快捷键整理分享

    正式转战Android Studio了,首先把Android Studio的快捷键摘录下来,以备后用. (官网的快捷键列表如下  https://developer.android.com/studi ...

  8. 我的Android进阶之旅------Android嵌入图像InsetDrawable的用法

    面试题:为一个充满整个屏幕的LinearLayout布局指定背景图,是否可以让背景图不充满屏幕?请用代码描述实现过程. 解决此题,可以使用嵌入(Inset)图像资源来指定图像,然后像使用普通图像资源一 ...

  9. 我的Android进阶之旅------android Matrix图片随意的放大缩小,拖动(转)

    step1:新建一个项目DragAndZoom,并准备一张照片放在res/drawable-hdpi目录下,如下图所示: step2: 设置应用的UI界面,在main.xml中设置: [html] v ...

  10. 我的Android进阶之旅------Android Gusture 手势识别小案例

    Step1: 生成一个Android Gusture Builder程序用于画Gusture然后存储起来用于其它的项目 首先导入  android SDK \android-sdk-windows\s ...

最新文章

  1. 点击率预估模型汇总_CIKM20MiNet:阿里|跨域点击率预估混合兴趣模型
  2. python全栈学习--day40()
  3. 编码方式 / ASCII、UNICODE、UTF-8、ANSI
  4. IOS模拟登录之沙盒原理
  5. linux进程signal,Linux 编程之【进程】signal
  6. oracle选择外键列,Oracle外键列上是否需要索引?
  7. hive - 可优化的 10 个地方及详解
  8. java matcher group_JAVA正则表达式matcher.find()和 matcher.matches()的区别
  9. java中调用数组参数_java中如何调用带有数组类型参数的存储过程
  10. VMware Workstation 12下载安装与激活图文教程
  11. 计算机酒店管理论文摘要,酒店餐饮管理系统论文摘要目录.doc
  12. Json工具 将对象转换为json格式字符串
  13. 20145322何志威 Exp8 Web基础
  14. STM32用一个定时器封装多个定时函数调用
  15. GPON Type B保护
  16. Manjaro安装配置指南
  17. 搜狗并入腾讯,看点再战头条?
  18. JSP设置Excel表格换行_如何在WPS-Excel表格中设置可爱的“温馨提示”?
  19. 电子商务法律规范与伦理道德(七)
  20. token代替session使用

热门文章

  1. python3断言_Python3断言
  2. 什么是用户与计算机硬件之间的桥梁,计算机应用基础简答题(附答案)
  3. java jpa 字段 关联_jpaQuery中查询字段是关联表的查询方法以及@JoinEntity(joinEntityAlias =str)的作用和代码编写的规范...
  4. python手机代码识别数字_python实现kNN算法识别手写体数字的示例代码
  5. thinkphp mysql批量入库_ThinkPHP3.2框架使用addAll()批量插入数据的方法
  6. 时间序列python复杂网络实例_基于时间序列数据的复杂网络重构
  7. linux系统pycharm安装配置
  8. 分类模型的评估方法-精确率(Precision)
  9. 全球及中国新能源汽车电机市场未来发展方向与投资潜力研究报告2022版
  10. 全球及中国太阳能光伏发电产业规模容量调研及投资可行性研究报告2021-2027年