精华内容
下载资源
问答
  • Java变量命名规则规范

    2021-02-12 10:07:11
    Java变量命名规则规范分类Camel 标记法:首字母是小写的,接下来的单词都以大写字母开头Pascal 标记法:首字母是大写的,接下来的单词都以大写字母开头匈牙利标记法:在以Pascal标记法的变量前附加小写序列说明该变量的...

    Java变量命名规则规范

    分类

    Camel 标记法:首字母是小写的,接下来的单词都以大写字母开头

    Pascal 标记法:首字母是大写的,接下来的单词都以大写字母开头

    匈牙利标记法:在以Pascal标记法的变量前附加小写序列说明该变量的类型

    在Java我们一般使用匈牙利标记法,下面重点介绍匈牙利标记法

    匈牙利标记法

    匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的。

    匈牙利命名法的基本结构为scope_typeVariableName,它 使用1-3字符前缀来表示数据类型,3个字符的前缀必须小写,前缀后面是由表意性强的一个单词或多个单词组成的名字,而且每个单词的首写字母大写,其它字 母小写,这样保证了对变量名能够进行正确的断句。例如,定义一个整形变量,用来记录文档数量:intDocCount,其中int表明数据类型,后面为表 意的英文名,每个单词首字母大写。这样,在一个变量名就可以反映出变量类型和变量所存储的值的意义两方面内容,这使得代码语句可读性强、更加容易理解。 byte、int、char、long、float、 double、boolean和short。

    匈牙利命名法举例来说,表单的名称为form,那么在匈牙利命名法中可以简写为frm,则当表单变量名称为Switchboard时,变量全称应该为 frmSwitchboard。这样可以很容易从变量名看出Switchboard是一个表单,同样,如果此变量类型为标签,那么就应命名成 lblSwitchboard。可以看出,匈牙利命名法非常便于记忆,而且使变量名非常清晰易懂,这样,增强了代码的可读性,方便各程序员之间相互交流代码。

    注意点

    1. 选择有意义的名字,注意每个单词首字母要大写。

    2. 在一段函数中不使用同一个变量表示前后意义不同的两个数值。

    3. i、j、k等只作为小型循环的循环索引变量。

    4. 避免用Flag来命名状态变量。

    5. 用Is来命名逻辑变量,如:blnFileIsFound。通过这种给布尔变量肯定形式的命名方式,使得其它开发人员能够更为清楚的理解布尔变量所代表的意义。

    6. 如果需要的话,在变量最后附加计算限定词,如:curSalesSum。

    7. 命名不相包含,curSales和curSalesSum。

    8. static final 变量(常量)的名字应该都大写,并且指出完整含义。

    9. 如果需要对变量名进行缩写时,一定要注意整个代码中缩写规则的一致性。例如,如果在代码的某些区域中使用intCnt,而在另一些区域中又使用intCount,就会给代码增加不必要的复杂性。建议变量名中尽量不要出现缩写。

    10. 通过在结尾处放置一个量词,就可创建更加统一的变量,它们更容易理解,也更容易搜索。例如,请使用 strCustomerFirst和strCustomerLast,而不要使用strFirstCustomer和strLastCustomer。常 用的量词后缀有:First(一组变量中的第一个)、Last(一组变量中的最后一个)、Next(一组变量中的下一个变量)、Prev(一组变量中的上 一个)、Cur(一组变量中的当前变量)。

    11. 为每个变量选择最佳的数据类型,这样即能减少对内存的需求量,加快代码的执行速度,又会降低出错的可能性。用于变量的数据类型可能会影响该变量进行计算所产生的结果。在这种情况下,编译器不会产生运行期错误,它只是迫使该值符合数据类型的要求。这类问题极难查找。

    12. 尽量缩小变量的作用域。如果变量的作用域大于它应有的范围,变量可继续存在,并且在不再需要该变量后的很长时间内仍然占用资源。它们的主要问题是,任何类 中的任何方法都能对它们进行修改,并且很难跟踪究竟是何处进行修改的。占用资源是作用域涉及的一个重要问题。对变量来说,尽量缩小作用域将会对应用程序的 可靠性产生巨大的影响。

    版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。

    展开全文
  • 浅谈Java中的命名规范

    2021-02-12 17:09:50
    现代软件架构的复杂性需要协同开发...本文将从Java代码命名规范这一维度,来探讨一下,如何写出健壮的、可读性强的代码,提高项目的可维护性。最重要的是提高我们的编程幸福感。1.包名统一使用小写,点分隔符之...

    现代软件架构的复杂性需要协同开发完成,如何高效地协同呢?

    答案是:制定一整套统一的规范。

    无规矩不成方圆,无规范难以协同,比如,制订交通法规表面上是要限制行车权,实际上是保障公众的人身安全,试想如果没有限速,没有红绿灯,谁还敢上路行驶?

    本文将从Java代码的命名规范这一维度,来探讨一下,如何写出健壮的、可读性强的代码,提高项目的可维护性。最重要的是提高我们的编程幸福感。

    1.包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。

    正例:应用工具包名为com.java.util、类名为StringUtils

    2.类名、接口名使用UpperCamelCase风格,必须遵从驼峰形式,但以下情形例外:DO/BO/DTO/VO/AO/PO/UID等。

    正例:UserLoginCheckService/UserDO

    反例:userlogincheckservice/UserDo

    3.方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式。

    正例:userServiceImpl

    反例:userserviceimpl

    4.常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。

    正例:MAX_BOOK_COUNT/CACHE_EXPIRED_TIME

    反例:MAX_COUNT/EXPIRED_TIME

    5.为了达到代码自解释的目标,任何自定义编程元素在命名时,使用尽量完整的单词组合来表达其意,即要做到“见名知意”。

    正例:在 JDK 中,表达原子更新的类名为:AtomicReferenceFieldUpdater

    反例:String a = "李四"; // 天啦噜,鬼知道你这个a是啥意思啊

    6.定义数组时,类型与中括号紧挨相连

    正例:

    int[] array = new int[10];

    int array[] = new int[10]; // 不建议这样写

    7.抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类的名称开始,以 Test 结尾。

    正例:AbstractService/CommonException/DemoTest

    8.杜绝完全不规范的缩写,避免望文不知义。

    反例:AbstractClass“缩写”命名成 AbsClass;condition“缩写” 命名成 condi,此类随意缩写严重降低了代码的可阅读性。

    9.如果模块、 接口、类、方法使用了设计模式,在命名时需体现出具体模式

    说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计理念。

    正例:public class OrderFactory;

    public class LoginProxy;

    public class ResourceObserver;

    10.对于 Service 和 DAO 类,基于 SOA 的理念,暴露出来的服务一定是接口,内部的实现类用Impl 的后缀与接口区别。

    正例:CacheServiceImpl实现CacheService接口

    11.如果是形容能力的接口名称,取对应的形容词为接口名(通常是–able 的形容词)。

    正例:JDK中的Comparable接口

    12.在long或者Long赋值时,数值后使用大写的 L,不能是小写的 l,小写容易跟数字 1 混淆,造成误解。

    说明:Long a = 2l;写的是数字的 21,还是 Long 型的 2 ??

    13.不允许任何魔法值(即未经预先定义的常量)直接出现在代码中

    正例:

    public static final ORDER_REDIS_KEY_PREFIX = "orderId_";

    String orderRedisKey = ORDER_REDIS_KEY_PREFIX + orderId;

    反例:

    String redisKey = "orderId_" + orderId;

    14.枚举类名带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开。

    正例:枚举名字为ProcessStatusEnum的成员名称:SUCCESS / UNKNOWN_REASON

    展开全文
  • java项目命名规范

    2021-03-06 03:55:46
    规范等级说明级别I: 默认...1.格式与命名规范(Formating and Naming Conventions)1.1 缩进使用Tab缩进,而不是空格键--将缩进2,4,8字符的选择权留给阅读者。1.2 换行每行120字符--因为已是1024*768的年代。if,for,...

    规范等级说明

    级别I:   默认登记要求所有项目中的所有成员遵守。

    级别II: 建议所有项目中的所有成员遵守。

    级别III: 鼓励各个项目根据实际情况执行。

    1.格式与命名规范(Formating and Naming Conventions)1.1   缩进

    使用Tab缩进,而不是空格键--将缩进2,4,8字符的选择权留给阅读者。

    1.2 换行

    每行120字符--因为已是1024*768的年代。

    if,for,while语句只有单句时,如果该句可能引起阅读混淆,需要用" {"和"}"括起来,否则可以省略。

    //错误,需要使用花括号{}括起来

    if(condition)

    if(condition) doSomething();

    else

    doSomething();1.3 命名规则

    遇到缩写如XML时,仅首字母大写,即loadXmlDocument()而不是loadXMLDocument()

    Package名必须全部小写,尽量使用单个单词

    Interface名可以是一个名词或形容词(加上'able','ible', or 'er'后缀),如Runnable,Accessible。

    为了基于接口编程,不采用首字母为I或加上IF后缀的命名方式,如IBookDao,BookDaoIF。

    局部变量及输入参数不要与类成员变量同名(get/set方法与构造函数除外)

    1.4 声明

    修饰符应该按照如下顺序排列:public, protected, private, abstract, static, final, transient, volatile, synchronized, native, strictfp。

    类与接口的声明顺序(可用Eclipse的source->sort members功能自动排列):静态成员变量 / Static Fields

    静态初始化块 / Static Initializers

    成员变量 / Fields

    初始化块 / Initializers

    构造器 / Constructors

    静态成员方法 / Static Methods

    成员方法 / Methods

    类型(内部类) / Types(Inner Classes)

    同等的类型,按public, protected, private的顺序排列。

    2.注释规范(Document Convertions)2.1 注释类型2.1.1 JavaDoc注释

    略。

    2.1.2 失效代码注释

    由/*...*/界定,标准的C-Style的注释。专用于注释已失效的代码。

    /*

    * Comment out the code

    * String s = "hello";

    * System.out.println(s);

    */2.1.3 代码细节注释

    由//界定,专用于注释代码细节,即使有多行注释也仍然使用//,以便与用/**/注释的失效代码分开

    除了私有变量外,不推荐使用行末注释。

    classMyClass {

    privateintmyField;//An end-line comment.

    publicvoidmyMethod {

    //a very very long

    //comment.

    if(condition1) {

    //condition1 comment

    ...

    }else{

    //elses condition comment

    ...

    }

    }

    }2.2 注释的格式

    注释中的第一个句子要以(英文)句号、问号或者感叹号结束。Javadoc生成工具会将注释中的第一个句子放在方法汇总表和索引中。

    为了在JavaDoc和IDE中能快速链接跳转到相关联的类与方法,尽量多的使用@see xxx.MyClass,@see xx.MyClass#find(String)。

    Class必须以@author 作者名声明作者,不需要声明@version与@date,由版本管理系统保留此信息。(II)

    如果注释中有超过一个段落,用

    分隔。(II)

    示例代码以

    包裹。(II)
     

    标识(java keyword, class/method/field/argument名,Constants) 以包裹。(II)

    标识在第一次出现时以{@linkxxx.Myclass}注解以便JavaDoc与IDE中可以链接。(II)

    2.3 注释的内容2.3.1 可精简的注释内容

    注释中的每一个单词都要有其不可缺少的意义,注释里不写"@param name -名字"这样的废话。

    如果该注释是废话,连同标签删掉它,而不是自动生成一堆空的标签,如空的@param name,空的@return。

    2.3.2 推荐的注释内容

    对于API函数如果存在契约,必须写明它的前置条件(precondition),后置条件(postcondition),及不变式(invariant)。(II)

    对于调用复杂的API尽量提供代码示例。(II)

    对于已知的Bug需要声明。(II)

    2.3.3 Null规约

    如果方法允许Null作为参数,或者允许返回值为Null,必须在JavaDoc中说明。

    如果没有说明,方法的调用者不允许使用Null作为参数,并认为返回值是Null Safe的。

    /**

    * 获取对象.

    *

    * @ return the object to found or null if not found.

    */

    Object get(Integer id){

    ...

    }2.3.4 特殊代码注释

    代码质量不好但能正常运行,或者还没有实现的代码用//TODO: 或 //XXX:声明

    存在错误隐患的代码用//FIXME:声明

    3.编程规范(Programming Conventions)3.1基本规范

    当面对不可知的调用者时,方法需要对输入参数进行校验,如不符合抛出IllegalArgumentException,建议使用Spring的Assert系列函数。

    隐藏工具类的构造器,确保只有static方法和变量的类不能被构造

    变量定义尽量基于接口而不是具体实现类,如Map map = new HashMap()

    代码中不能使用System.out.println(),e.printStackTrace(),必须使用logger打印信息。

    3.2 异常处理

    重新抛出的异常必须保留原来的异常,即throw new NewException("message",e); 而不能写成throw new NewException("message")。

    在所有异常被捕获且没有重新抛出的地方必须写日志。

    如果属于正常异常的空异常处理块必须注释说明原因,否则不允许空的catch块。

    框架尽量捕获低级异常,并封装成高级异常重新抛出,隐藏低级异常的细节。(III)

    3.3 代码度量3.3.1 耦合度度量

    DAC度量值不要不大于7 ( III )

    解释:DAC(Data Abstraction Coupling)数据抽象耦合度是描述对象之间的耦合度的一种代码度量。DAC度量值表示一个类中有实例化的其它类的个数。

    CFO度量值不要不大于20 ( III )

    解释:CFO(Class Fan Out)类扇出是描述类之间的耦合度的一种代码度量。CFO度量值表示一个类依赖的其他类的个数。

    3.3.2 方法度量

    方法(构造器)参数在7个以内 ( II )

    太多的方法(构造器)参数影响代码可读性,还是不良设计的征兆。考虑用值对象代替这些参数,或者重新设计。

    方法长度150行以内 ( II )

    太长的方法影响代码可读性,还是一个方法承担了太多责任的征兆。建议拆分责任。

    CC 度量值不大于10(III )

    解释:CC(CyclomaticComplexity)圈复杂度指一个方法的独立路径的数量,可以用一个方法内if,while,do,for,catch,switch,case,?:语句与&&,||操作符的总个数来度量。

    NPath度量值不大于200 ( III )

    解释:NPath度量值表示一个方法内可能的执行路径的条数。

    3.3.3 其他度量

    布尔表达式中的布尔运算符(&&,||)的个数不超过3个(III)

    if语句的嵌套层数3层以内(II)

    文件长度2000行以内(II)

    太大的源程序文件影响代码可读性,还是一个类承担了太多责任的征兆,建议拆分责任到其他类上。

    匿名内部类20行以内 ( II )

    太长的匿名内部类影响代码可读性。建议:重构为命名的(普通)内部类。

    3.4 JDK5.0

    重载方法必须使用@Override,可避免父类方法改变时导致重载函数失效。

    不需要关心的warning报告用@SuppressWarnings("unused"),@SuppressWarnings("unchecked"),@SuppressWarnings("serial") 注释掉

    4.自动代码检查

    使用Eclipselinkext7.gif与Inellij IDEAlinkext7.gif的代码校验已经可以查出很多的代码质量问题。再配合使用Checkstylelinkext7.gif,PMDlinkext7.gif,FindBugslinkext7.gif三重检查,涵盖了大部分的代码GuideLine。

    Eclipse:在Windows->Preferences->Java-Compiler->Errors/Warnings中,按本文档的规则将一些原来Ignore的规则打开。

    IDEA:在Setting->Errors中设定规则,调用Analyzer->Inspece Code进行校验。

    CheckStyle:安装CheckStyle的Eclipse插件linkext7.gif,在Windows->Preferences->CheckStyle导入springside团队预设在/tools/codereviewer/springside_check.xml的规则

    PMD:安装PMD的Eclipse插件linkext7.gif,Windows->Preferences->PMD清除原来所有规则,导入springside团队预设在/tools/codereviewer/springside_pmd.xml的RuleSet。

    FindBugs:安装FindBugs的Eclipse插件linkext7.gif,在项目属性->FindBugs中,取消下列警告MS/EI/EI2/ , SnVI/SE/WS/RS ,ST/NP/UwF/SS/UuF|UrF|SIC

    5.参考资料

    展开全文
  • java命名规范

    千次阅读 2021-03-22 16:40:08
    一、命名规范1、 项目名全部小写2、 包名全部小写3、 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写。如:public class MyFirstClass{}4、 变量名、方法名首字母小写,如果名称由多个单词组成...

    一、命名规范

    1、 项目名全部小写

    2、 包名全部小写

    3、 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写。

    如:public class MyFirstClass{}

    4、 变量名、方法名首字母小写,如果名称由多个单词组成,每个单词的首字母都要大写。

    如:int index=0;

    public void toString(){}

    5、 常量名全部大写

    如:public static final String GAME_COLOR=”RED”;

    6、所有命名规则必须遵循以下规则:

    1)、名称只能由字母、数字、下划线、$符号组成

    2)、不能以数字开头

    3)、名称不能使用JAVA中的关键字。

    4)、坚决不允许出现中文及拼音命名。

    二、注释规范

    1、 类注释

    /**

    Copyright (C), 2006-2010, ChengDu Lovo info. Co., Ltd.

    FileName: Test.java

    类的详细说明

    @author 类创建者姓名

    @Date 创建日期

    @version 1.00

    */

    2、 属性注释

    在每个属性前面必须加上属性注释,注释模板如下:

    /** 提示信息 */

    private String strMsg = null;

    3、 方法注释

    在每个方法前面必须加上方法注释,注释模板如下:

    /**

    类方法的详细使用说明

    @param 参数1 参数1的使用说明

    @return 返回结果的说明

    @throws 异常类型.错误代码 注明从此类方法中抛出异常的说明

    */

    4、 构造方法注释

    在每个构造方法前面必须加上注释,注释模板如下:

    /**

    构造方法的详细使用说明

    @param 参数1 参数1的使用说明

    @throws 异常类型.错误代码 注明从此类方法中抛出异常的说明

    */

    5、 方法内部注释

    在方法内部使用单行或者多行注释,该注释根据实际情况添加。

    9a9ba11fac41

    image

    最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:909038429

    /./*欢迎加入java交流Q君样:909038429一起吹水聊天

    展开全文
  • Java命名规范

    千次阅读 2021-02-27 21:02:40
    一、命名规范1、项目名全部小写2、包名全部小写3、类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写。如:public class MyFirstClass{}4、变量名、方法名首字母小写,如果名称由多个单词组成,每...
  • java命名如何规范

    2021-02-26 17:58:15
    java命名如何规范java定义这个规范的目的是让项目中所有的文档都看...一、命名规范1、 项目名全部小写2、 包名全部小写3、 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写。如:public class M...
  • java程序里是有着命名规范的,不是说你想写什么就写什么,不按照规范写不到几行代码就会报红,下面来看看java有着哪些命名规范吧。项目名:1:一部分人采用简写,然后全部大写;2:一部分人使用首字母大写+驼峰命名...
  • 1. 【强制】 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。反例: _name / __name / $Object / name_ / name$ / Object$2. 【强制】 代码中的命名严禁使用拼音与英文混合的方式,更不...
  • java 命名规范

    2021-03-10 03:54:45
    但是由于Java面向对象编程的特性,每一名Java程序员都 可以编写属于自己的Java包,为了保障每个Java命名的唯一性,在最新的Java编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前缀。 由于互联网上的域...
  • java常量命名规则

    2021-02-12 23:10:30
    java常量命名规则Java常量命名规则如下:规则一.所有单词的字母都是大写,如果有多个单词,那么使用下划线链接即可。如:public static final int AGE_OF_PERSON = 20; //通常加上static规则二.不允许任何魔法值(即...
  • JAVA命名规范

    2021-02-28 12:27:56
    但是由于Java面向对象编程的特性,每一名Java程序员都 可以编写属于自己的Java包,为了保障每个Java命名的唯一性,在最新的Java编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前缀。 由于互联网上的域...
  • Java的一些命名规范

    2021-02-26 11:41:57
    1.【强制】代码中的命名均不能以下划线或美元符号开始也不能以下划线或美元符号结束。反例:_name/—name/$name/name_/name$/name—2.【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式...
  • java中方法的命名规范

    2021-03-04 00:06:58
    java中方法的命名规范发布时间:2020-06-25 19:52:51来源:亿速云阅读:167作者:Leah这期内容当中小编将会给大家带来有关java中方法的命名规范,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望...
  • 1.【强制】 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。反例: _name / __name / $Object / name_ / name$ / Object$2.【强制】 代码中的命名严禁使用拼音与英文混合的方式,更不...
  • 一篇搞定Java命名规范

    2021-02-12 17:09:50
    好的代码本身就是注释,减少不必要的注释驼峰命名规则大驼峰命名类名全部使用大驼峰ServiceDiscovery、ServiceInstance、LruCacheFactory小驼峰命名方法名,参数名,成员变量,局部变量getUserInfo()、...
  • Java标识符命名规则

    2021-02-28 15:50:51
    Java标识符命名规则Java语言的命名规范需遵守下面9个条件:1.标识符由26个英文字符大小写(a~zA~Z)、数字(0~9)、下划线(_)和美元符号($)组成。2.不能以数字开头,不能是关键字3.严格区分大小写4.标识符的可以为任意...
  • JAVA代码规范

    2021-02-26 13:49:11
    (本文标准依赖于阿里巴巴的JAVA开发代码规范)示例以下举出本猿在工作中常常出现的问题,包括但不仅限于:逻辑判断语句在 if/else/for/while/do 语句中必须使用大括号,即使只有一行代码,避免使用下...
  • 想要成为一个优秀的程序员,首先要培养良好的编程习惯,为了提高代码的可读性,必须有好的命名规范。这篇文章是小编结合网上的很多资料整理出来的,若有不当或错误的地方,欢迎大家指正在文章开始前,为方便阅读,先...
  • 欢迎关注方志朋的博客,回复”666“获面试宝典在本文中,将从大到小,从外到内,总结Java编程中的命名规范。文中将会涉及到日常工作中常见的命名示例,如包命名,类命名,接口命名,方法命名,变...
  • java 命名空间 命名规则更新时间:2008年01月30日 20:55:09 作者:java 命名空间 命名规则摘要Java的类装载器是Java动态性的核心,本文将向大家简要介绍Java的类装载器,及相关的parentdelegation模型,命名空间,...
  • java类方法属性的命名规范介绍

    千次阅读 2021-02-12 22:42:09
    java类方法属性的命名规范介绍,java命名总结。一个优秀的程序员,首先要培养良好的编程习惯,为了提高代码的可读性,必须有好的命名规范。这篇文章是小编结合网上的很多资料整理出来的,若有不当或错误的地方,欢迎...
  • Java代码编写规范

    2021-02-28 12:29:01
    一、说在前面:二、前言1、“代码规范”可以分成两个部分。(1)代码风格规范。主要是文字上的规定,看似表面文章,实际上非常重要。(2)代码设计规范。牵涉到程序设计、模块之间的关系、设计模式等方方面面,这里有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 234,591
精华内容 93,836
关键字:

java代码命名规范

java 订阅