Java代码编写规范_第1页
Java代码编写规范_第2页
Java代码编写规范_第3页
Java代码编写规范_第4页
Java代码编写规范_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、LiEMS3 .0 系统JAVA编码规范南京朗坤软件有限公司?2004年 南京朗坤自动化有限公司 版权所有 机密文档,未经授权,不得外传文档类型:编码规范作者:技术平台小组南京朗坤软件有限公司南京市江宁区铜山金铜路2号211156电话:+86 25 86192500传真:+86 25 86192503Web:http:/www .lu cule nt. net日期:2004年8月31日版本:1.0客户:发布人员:文档审核:文档批准::年月日:年月日: 年 月日修正记录版本日期作者修改描述1.02004-8-31技术平台小组初稿1 概述71.1 背景71.2 读者对象71.3 商讨72 基本原则

2、82.1 一开始就必须正确的使用规范 82.2 简易性原则 82.3 清晰性原则 82.4 健壮性原则 82.5 效率原则83 格式规范93.1 代码缩进93.2 分解较长的行 93.3 空白区域的使用 113.4 不经常使用TAB 143.5 SQL语句书写规范 144 命名规范184.1 使用有意义的命名 184.2 使用术语进行命名 184.3 超长命名处理 184.4 保留兀音 194.5 缩写后的首字母大写 194.6 不要用字符的大小写来区分命名 194.7 包命名194.7.1 包命名194.7.2 使用单一的、小写单词来命名每一个包 204.8 类命名204.8.1 类或接口的

3、每个单词的首字母大写 204.8.2 使用名词来命名类204.8.3 一组有关系的属性、静态服务或常量的类命名采用复数 204.9 接口命名214.9.1 使用名词或形容词来命名接口 214.10 方法的命名 224.10.1 方法的首单词的首字母小写,后面的单词的首字母大写 224.10.2 使用动词来命名方法 224.10.3 遵从JavaBea ns规则来命名访问方法 234.11 变量命名234.11.1 在变量的命名中,变量的首单词的首字母小写,后面的单词的首字母大写 234.11.2 使用名词来命名变量 244.11.3 集合含义的变量采用复数形式进行命名 244.11.4 建立一

4、套标准的临时使用的变量规则 244.12 属性命名254.12.1 使用“ this”关键字限定属性变量,用于区分逻辑变量 254.13 参数命名254.13.1 当一个构件器或一个“ set”方法通过参数赋值给一个属性时,将参数和属性采用同样的名字来命名254.14 常量命名265 注释规范275.1 保持注释和代码同步 275.2 使用主动语态并尽量忽略不需要的用词 275.3 注释类型275.4 版权信息注释 275.5 使用文档注释来描述程序接口 285.6 使用标准代码去隐藏代码而不要删除它 295.7 使用行注释来解释实现细节 295.8 文档注释305.8.1 在代码编写前就描述

5、程序接口 305.8.2 文档中应描述公有、保护、包和私有的成员 305.8.3 对每个包提供概要描述信息和总体的功能 305.8.4 对每个应用或一组包提供概要描述信息和总体的功能 305.9 注释格式315.9.1 在所有的文档注释中,使用一致的格式和结构 315.10 使用第三人称代词 315.11 使用THIS ”而不是THE”指向当前类的实例 315.12 不要在方法或构造函数名后添加“()”,除非做一个特殊的标识 325.13 注释内容325.13.1 为每一个类、接口、属性和方法提供一个概要描述 325.13.2 充分描述每个方法提供的操作 325.13.3 解释和理解你的软件的

6、使用,最简单的方法是提供例子。 325.14 以文档方式记录已知的缺点和不足 335.15 记录同步的语义 335.16 代码内部注释 345.16.1 需要帮助他人理解代码时才增加内部注释 345.16.2 描述代码应该做的事情,而不是描述代码正在做什么 345.16.3 避免使用行末注释的方法 345.16.4 采用行末注释的方式解释局域变量 345.16.5 创建并使用一套关键字集来标注未解决的问题 345.16.6 在多重嵌套控制结构中标注结束标志 355.16.7 如果在switch语句中没有break,则在相应的两个case之间添加一行“ fall-through ”注释355.1

7、6.8 标注 empty 语句366 编程规范376.1 将代表基础数据类型的类声明为FINAL 376.2 定义类和方法尽可能短小精悍 376.3 将所有成员变量声明为 PR|VATE类型376.4 使用多态(POLYMORPHISM),不使用 ISNTANCEF 376.5 类型安全376.5.1 用Object对象代替一般目的类可以提供静态类型检验 376.5.2 将枚举类型封装为类386.6 语句与表达式 386.6.1 用等价的方法替换重复的表达式 386.6.2 在控制结构中尽量使用代码块来代替表达式 386.6.3 用圆括号清晰地标明运算的顺序 396.6.4 在switch语句

8、的最后一个case语句块结束的地方加上一个 break语句。406.6.5 判断两个对象的值是否相等,使用equals。,而不是使用=416.7 构造函数416.7.1 保证对象的构造总是有效 416.7.2 在构造函数中不要引用非常量方法416.7.3 使用嵌套构造器来消除冗余的代码426.8 异常处理426.8.1 使用未检测到的、运行时异常来报告程序中未预测到的逻辑错误 426.8.2 使用可检验的异常处理来报告可能发生的程序错误,但是,在正常的程序运行中,这种是错误是很少发生的。 436.8.3 使用return代码报告可预测性的状态变化 436.8.4 转移异常信息的处理 436.8

9、.5 不要对运行时异常或者错误不做任何处理 436.8.6 用一个fin ally语句块释放资源447编程技巧457.1 BYTE 数组转换到 CHARACTERS457.2 UTILITY类457.3 初始化457.4 对象构造457.4.1 不要在循环中构造和释放对象 457.4.2 处理Stri ng的时候要尽量使用 Str in gBuffer类。457.5 避免太多的使用SYNCHRONIZED关键字457.6 通过对系统数据结构的划分与组织的改进,以及对程序算法的优化来提高空间效率。.457.7 循环体内工作量最小化。 467.8 不应花过多的时间提高调用不很频繁的函数代码效率。4

10、77.9 在保证程序质量的前提下,通过压缩代码量、去掉不必要代码以及减少不必要的局部和全局变量,来提高空间效率。 477.10 在多重循环中,应将最忙的循环放在最内层。477.11 尽量用乘法或其它方法代替除法,特别是浮点运算中的除法。471概述1.1 背景程序的编码是一个创造性极强的工作,虽然要奇思妙想,但也必须要遵守一定的规则和限制,编码风格的重要性对大型软件项目开发来说是不言而喻的。Liems3产品开发基于 Java语言J2EE技术路线,为了规范 Java编码、提高编码质量、 增强代码的可读性和可维护性特制定本规范。开发工程师在开发过程中必须遵守本规范,规范是代码编写及代码验收等管理环节

11、中必须执行的标准。1.2 读者对象本手册的读者对象为 Java开发工程师和测试工程师。1.3 商讨对规范如有疑问请及时和技术平台小组联系。/M.LUCVLENTT2基本原则以下是开发过程中必须遵循的基本原则,可能缺乏操作性,却是后续规范的概括和总结。对暂未能列入本编码规范的问题,作一般性要求。2.1 一开始就必须正确的使用规范为保证整个产品编码风格的一致性,要求在产品的第一个模块开始,必须严格使用本规范开始编码。2.2 简易性原则代码的编写力求简易性,构建类和方法力求简单,提高代码的可读性和可维护性。2.3清晰性原则确保每一个类、接口、方法、变量和对象都有清楚的功能,并解释在何时、何地使用。

12、设计人员应确保此原则的贯彻执行。2.4健壮性原则程序要健壮,要为错误和异常提供可预见的处理,不能隐藏错误和异常。2.5 效率原则编码要兼顾程序运行期效率。3格式规范3.1代码缩进所有的语句块内部需要缩进,语句块通常被包围,它包括但不仅包括类定义,函数定义,条件分支,循环体采用两个空格来进行代码缩进,增强可读性,不要使用太多的空格。class MyClass .void fun cti on (i nt arg) .if (arg 0) for (int in dex = 0; in dex = arg; in dex+) / .另外,在程序块中,对于一个用于处理循环的结构,也要使用缩进,以突出

13、结构显示:void fun citi on (i nt arg) .loop:.for (int in dex = 0; in dex 0.0 ? (x / le ngth) : x;空白行使用在下列情况下:对于负号的情况,如果之后为长表达式,按二元操作符的要求补空格,如int a = -3(没有空格)int a = - a + 3(补一个空格)方法实现中的每一个逻辑块:void han dleMessage(Message message) Data In put content = message.getDate In put();Int messageType = conten t.re

14、adI nt();Switch (messageType) case WARNING:处理break;case ERROR:. 处理break;default:. 处理 break;类和接口的成员定义public class Foo *定义一个内部类*/class Inn erFoo * 成员Bar.*/private Bar bar;*用指定的Bar构建一个 Foo /*/Foo(Bar bar) this.bar = bar;源代码文件中每个类和接口的定义/ * .文件描述.*/ package pa ny .xyz;/*接口描述*/in terface Fooln terface * .

15、 类描述.*/public class Foo impleme nts Fooln terface 3.4 不允许使用TAB使用TAB键来进行源代码的缩进和排列可能对环境的依赖很强,在原始开发环境中显示正常格式的代码,转换到不能很好的支持 TAB键的环境中时,代码将失去原有的格式。如TAB = 8 space 的效果:private final int EXAMPLE_1= 2;private final int EXAMPLE_TAB_LONG_NAME = 4;而在TAB = 4 space 的效果private final int EXAMPLE_1 = 2;private final

16、int EXAMPLE_TAB_LONG_NAME = 4;原本的对齐效果失去了意义提示:Jbuilder X中支持将Tab转换为固定空格,因此可以认为在JBuilder中TAB与空格等价,因此可以使用。3.5 SQL语句书写规范 SELECT语句书写规则分为两种情况:关键字用大写,一目了然,如:SELECT count(*) as counter FROM ctrmas , select语句的选择字段需要详细,原则上不鼓励使用select * from,而应该书写具体的字段名,以免表结构变更带来兼容性问题。对于简单的Select语句可以使用一个变量来写完:strSql = se

17、lect coun t(*) as coun ter from ctrmas;where 中对于复杂的select语句使用连个变量完成一条语句,要求每个字段、每个的条件作为一行方便阅读,在每行的前面加一个空格。同时要求每行的字段对齐,SQL关键字对齐。strFrom = selectIIfromdisti nct(asgmas.emp nu m),+empmas.sht nam +asgmas, outer empmas ;不允许下面的写法,上面的语句能被编译器优化为常量字符串,下面的语句会被处理成4条语句,要构造3次StringBuffer。strFrom =;strFrom = strFr

18、omstrFrom = strFrom+ select dist in ct(asgmas.emp nu m),;+ empmas.sht nam ;+ from asgmas, outer empmas ;strFrom =strFrom例2:strWhere=whereasgmas.crew no = + mstrPKey+ +andasgmas.emp num is not n ull +andempmas.emp num = asgmas.emp num +orderby sht nam;或用下面写法strWhere一 Illi.一 ,strWhere=strWhere+whereas

19、gmas.crew no = + mstrPKey + strWhere=strWhere+andasgmas.emp num is not n ull ;strWhere=strWhere+andempmas.emp num = asgmas.emp num ;strWhere=strWhere+order by sht nam;3)strSQL =strFrom+strWhere;insert语句书写规则insert语句的编写规则,必须列出所有要插入的字段。每个字段的值占用一行,方便阅读与检查。strSQL = insert into rtamas +(rta num, av

20、ltyp, effdat, expdat, begtim, en dtim, en ttyp, pla ncd, crew no, skilcd, emp num, un vcod, sht nam, qtyval, lstusr, lstdtm, fstusr, fstdtm) +values (+mln gSe qnum+ ,+mstrAvltyp +,+FormatDBDate(mdtmDatefr) +,+FormatDBDate(mdtmDateto) +,+Format(mdtmTimefr, hh:mm:ss) +,+Format(mdtmTimeto, hh:mm:ss) +,

21、+EM,+mstrPla ncd +,+mstrCrew no +,+mstrSkilcd +,+mstrEmp num+ ,+III IImstrU nvcod +,+Trim(ReplaceChar(mstrDescriptio n, , )+WB,+FormatDBDateTime(Now)+ , +WB,+FormatDBDateTime(Now)+ );也可以每行分开写,如:strSQL =”;strSQL = strSQL + in sert into rtamas ;strSQL = strSQL + (rtanum, avltyp, effdat, expdat, begtim

22、, endtim, enttyp, plancd, crew no, skilcd, emp num, un vcod, sht nam, qtyval, lstusr, lstdtm, fstusr, fstdtm);strSQL =strSQL+values (;strSQL =strSQL+mln gSe qnum+ ,;strSQL =strSQL+mstrAvltyp +,;strSQL =strSQL+FormatDBDate(mdtmDatefr)+strSQL =strSQL+FormatDBDate(mdtmDateto)+strSQL =strSQL+Format(mdtm

23、Timefr, hh:mm:ss)strSQL =strSQL+Format(mdtmTimeto, hh:mm:ss)strSQL =strSQL+EM,;strSQL =strSQL+mstrPla ncd +,;strSQL =strSQL+mstrCrew no+ ,;strSQL =strSQL+mstrSkilcd +,;strSQL =strSQL+mstrEmp num+ ,;strSQL =strSQL+mstrU nvcod +,;strSQL =strSQL+Trim(ReplaceChar(mstrDescriptio n,strSQL =strSQL+1 ;1 1 1

24、strSQL =strSQL+WB,;strSQL =strSQL+FormatDBDateTime(Now)+strSQL =strSQL+WB,;strSQL =strSQL+FormatDBDateTime(Now)+update语句的编写规则III III.Ill 111.+II.);)Ill III.III II.III II.where条件复杂时与insert语句相似,对于一行必须只能给一个字段的赋值。但是当 可以用单独的变量来处理,同样也可以采用分行写的方法。strSQL = update rtamas set avltyp = + mstrAvltyp +,+ef

25、fdat =FormatDBDate(mdtmDatefr)III IIexpdat =inbegtim =inFormatDBDate(mdtmDateto)Format(mdtmTimefr, hh:mm:ss)in nin nendtim =inFormat(mdtmTimeto, hh:mm:ss)III IIpla ncd =mstrPla ncd+ +crew no =mstrCrew no+ +skilcd =+ mstrSkilcd + +emp num = + mstrEmp num+ unvcod = +mstr Un vcod +sht nam = +mstrDescri

26、pti on+ lstusr = WB,lstdtm = +FormatDBDateTime(Now)+ where rtanum =+ mln gSe qnum;delete语句的编写规则。where rtanum =andpla ncd =andcrew no =与select语句相似。当where条件复杂时可以用单独的变量来处理。每个条件占用一行。可以采用分行写的方法。strSQL = delete from rtamas + mln gSe qnum+ + mstrPla ncd+ , + mstrCrew no +;4命名规范4.1使用有意义的命名在命名一个类、变量、方

27、法或常量时,使用有意义的命名,可提高程序的可读性,避免使用单个字符或通用名字来定义类、变量、方法或常量。下面例中的变量“ a”和常量“ 65”的意义就不清楚。if (a 65) / “a ”描述的意义是什么y = 65- a;else y = 0;通过定义有意义的命名,修改后的代码就比较易懂。if (age RETIREMENT_AGE) yearsToRetriement = RETIREMENT_AGE - age;else yearToRetireme nt = 0;对于那些能够提供足够的信息来决定其目的的临时变量,可以不使用这种规则,如下面代码中的用于循环计数或索引的变量:for (i

28、nt i = 0; i nu mberOfStude nts; +i) en rollStude nt(i);对于经常使用的这种类型的变量,也可以作为标准。4.2使用术语进行命名使用在特定领域的术语来进行命名,例如:比如使用电力行业术语来命名。4.3 超长命名处理对于一个对象的命名必须描述它的使用目的,如果一个类、接口、变量或方法的名字非常长。那么对应的实体将很难被实现。面对这种情况,在不减少实际意义的前提下简化实体 的命名,首先考虑它的设计目的,分解这个实体,通过更简单的命名来生成新的类、接口、 方法和变量。4.4 保留元音如果多个有含义的命名被缩写后相同,这样的缩写将影响代码的可读性,并使

29、得代码容易混淆,因此在缩写时,保留元音。但是这样的处理也会造成临时阅读代码的用户感到困难。 对比下面两段程序:public Message appe ndSig nature (Message message,Stri ngsig nature ) public Msg app ndSg ntr(Msg msg,Stri ng sgntr) 如果需要移出元音来简化长命名,那么就应该考虑初始的命名是不是适当的。4.5缩写后的首字母大写对于那些以单词作为分割的命名,这条规则可以帮助我们排除混淆。setDSToffset setDst OffsetloadXMLDocume ntloadXmlDoc

30、ume nt但不要在以下的处理中使用这个规则:对于那些只包含大写字母的常量(常量的命名规则参见 4.14)static final StringXML_DOCUMEN T “ text/XML ”方法、变量、参数命名时,首单词的缩写用小写(参见 4.11)private Docume ntxml Docume nt4.6不要用字符的大小写来区分命名JAVA编译器能够通过大小写来区分只存在大小写差异的两个不同命名。但对于阅读代 码的人来说,在读取的时候就容易造成混淆。例如:在同一个代码范围内,存在两个变量 theSQLInputStream 和theSqlInputStream,这样的代码就会给

31、阅读的人带来很大的不便。4.7 包命名4.7.1 包命名使用公司颠倒的In ternet 域名作为包的根限定。例如定义一个包为server,那么这个包的命名为 4.7.2 使用单一的、小写单词来命名每一个包包在命名时,采用有含义的单个小写单词,例如: java.io 和4.8 类命名4.8.1 类或接口的每个单词的首字母大写类或接口的每个单词的首字母大写。在每个命名中使用首字母大写来区分每个单词,用这种方式来区分类或接口与变量的命名(变量的命名规则参见4.11)public class Prin tStreamexte ndsFilterOutputStream public in terfa

32、ceAction Liste nerexte ndsEven tListe ner4.8.2 使用名词来命名类类用来定义对象或相关的事物,故而使用名词标识符来命名类。class CustomerAccount public abstract classKeyAdapter implements KeyListener 4.8.3 一组有关系的属性、静态服务或常量的类命名采用复数使用类来命名的一组有关系的属性、静态服务或变量,使用复数来进行类的命名。* The L in eMetrics class give*access to the metrics n eeded to layout*cha

33、racters along a line ant to layout of*a set of lin es.*/public class Lin eMetrics public Lin eMetrics()public abstract int getNumChars();public abstract float getAsce nt();public abstract float getDesce nt();public abstract float getLead in g();public abstract float getHeight();F面示例中,在类java.bea n.Be

34、a ns中定义了一组静态服务:/* The Bea ns class provides some*ge neral purpose bea ns con trol methods.*/public class Bea ns public static Object in sta ntiate(.) .;public static Object get In sta nceOf(.) .; public static boolean isInstanceOf(.) .; public static boolea n isDesig nTime() .;public static boolean

35、isGuiAvailable() .; public static void setDesig nTime(.) .;public static void setGuiAvailable(.) .;F面示例中,在类 java.sql.Types中定义了一组静态常量:/* *The Types class defi nes con sta nts*that are used to ide ntify SQL types */public class Types public final static int BIT = -7;public final static int TINYINT = -

36、6;public final static int SMALLINT = 5;public final static int INTEGER = 4;public final static int BIGINT = -5;public final static int FLOAT = 6;public final static int REAL = 7;public final static int DOUBLE = 8;public final static int NUMERIC = 2;public final static int DECIMAL = 3;public final st

37、atic int CHAR = 1;4.9 接口命名4.9.1 使用名词或形容词来命名接口故而用名词或形一个接口用来描述一个提供的服务,或用来描述一个服务提供的功能,容词来描述一个接口。public in terface Action Liste ner public void action Performed(Act ionEvent e);使用形容词来命名接口的功能和行为,大多数的接口命名采用动词后加able ”或ible后缀的形容词来描述接口的功能:public in terface Runable public void run();public in terface Accessib

38、le public Con text getC on text();4.10方法的命名4.10.1方法的首单词的首字母小写,后面的单词的首字母大写大写字母用于分割方法名中使用的单词,首字母小写用来区分方法和构造器。class Mylmage exte nds Image public MyImage() public void flush () public ImagegetScaled In sta nee() 4.10.2使用动词来命名方法方法和操作通常使用动词来定义其行为:class Accout private int bala nee;public void withdraw(i n

39、t amount) deposit(-1 * amoun t);public void deposit (int amount) this.bala nee += amount;4.10.3 遵从JavaBeans规则来命名访问方法JavaBeans为访问javaBeans实例的属性方法建立了一套标准的规范,那么在类中命名一个方法时就必须遵从这个规范,不管是否实现一个bea n。JavaBean中定义一个布尔类型的方法的命名时,以is ”开始boolean is Valid() return this.isValid;JavaBean提供一个读取的方法时,命名采用get ”开始String g

40、et Name() return this. name;访问方法读取一个索引属性时,使用” intin dex ”String getAlias( int in dex ) retur n this.aliases(i ndex);JavaBean中设定一个布尔或其他类型的属性时,命名采用“set ”开始void set Valid(Boolean isValid) this.isValid = isValid;void set Name(String name) this. name = n ame;访问方法设定一个索引属性时,使用” intindex ”和“ set ”void set A

41、lias( int index,String alias) this.aliasesi ndex = alias;请在JDK中,坚持使用这些规则,用is/get/set 符号来处理Bean的属性。4.11变量命名4.11.1在变量的命名中,变量的首单词的首字母小写,后面的单词的首字母大写大写字母用于分割变量名中使用的单词,首字母小写用来区分变量和类(类定义规则参见规则4.8)class Customer address ) address ;daytimePhone ) private Address private Address private Phone private Vectorbi

42、lli ngAddress shipp in gAddressdaytimePhone ;openOrders ;private Address address;private Phone daytimePhone;public Address setAddress(Address Address oldAddress = this.this. address = address ; return oldAddress ;public void setDaytimePh on e(Ph one 4.11.2 使用名词来命名变量变量用来表示一个对象或事物,故而采用名词来标识变量class Cus

43、tomer 4.11.3集合含义的变量采用复数形式进行命名对于代表一个集合的变量或属性,使用复数形式来进行命名,这种命名方式可将代表集合值的的变量或属性与代码单个值的变量或属性分离开:Customer customers = newCustomerMAX_CUSTOMERS;void addCustomer(int index, Customercustomer) this. customers index = customer vector orderitems = new Vector();void addOrderitem(Orderitem orderitem ) this. orde

44、ritems .addElement( orderitem );4.11.4 建立一套标准的临时使用的变量规则应该使用全名来描述大多数变量,但对于Java代码中经常使用的且具有相同“简写的变量,使用另外的字母代替,在下表中列出了一些例子:c,d,ex,y,zEOin, out,i nOutSCharacter Coordin ate Excepti on Graphics Object StreamStri ng4.12属性命名4.12.1使用“ this ”关键字限定属性变量,用于区分逻辑变量class Dude private String name;public Dude(Stri ng

45、 n ame) this. name = n ame;public setName(Stri ng n ame) this. name = n ame;4.13参数命名4.13.1当一个构件器或一个“ set”方法通过参数赋值给一个属性时,将参数和属性采用同 样的名字来命名使用逻辑变量来隐藏实例变量的名称,这是一种” poor ”风格,但这种规则也有些有益的地方,使用相同的命名能比使用不同的命名更能让人意识到其中的重要性,同时使用相同的命名能让你准确地了解参数是赋值给属性的。class Dude private String n amepublic Dude(Stri ng nam this. name = n ame;n ame public setName(Stri ng this. name = n ame;4.14常量命名在命名常数时,每一个单词中的所有字母大写,单词之间采用下划线来进行分割 使用大写来命名常量。使得他们能够很好与变量区分。class Byte MAX_VALUE 255;MIN_VA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论