当前位置: 首页 > news >正文

常德市网站建设温州网站托管

常德市网站建设,温州网站托管,衡水建网站,网络营销推广方案怎么做本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题#xff0c;包括对象创建#xff0c;并发#xff0c;序列化#xff0c;反射等。 它将指导您完成Java掌握的过程#xff01; 在这里查看 #xff01; 目录 1.简… 本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题包括对象创建并发序列化反射等。 它将指导您完成Java掌握的过程 在这里查看 目录 1.简介 2.方法签名 3.方法主体 4.方法重载 5.方法覆盖 6.内联 7.递归 8.方法参考 9.不变性 10.方法文档 11.方法参数和返回值 12.方法作为API入口点 13.接下来是什么 14.下载源代码 1.简介 在本教程的这一部分中我们将花费一些时间来讨论与Java设计和实现方法有关的不同方面。 正如我们在本教程的前面部分所看到的那样用Java编写方法非常容易但是有很多事情可以使您的方法更具可读性和效率。 2.方法签名 众所周知Java是一种面向对象的语言。 这样Java中的每个方法都属于某个类实例如果使用static方法则属于一个类本身具有可见性或可访问性规则可以声明为abstract或final等。 但是可以说方法的最重要部分是它的签名返回类型和参数以及方法实现可能抛出的已检查异常的列表但是如今这一部分的使用越来越少了。 下面是一个小例子 public static void main( String[] args ) {// Some implementation here } main方法将字符串数组作为唯一参数args接受并且不返回任何内容。 使所有方法保持与main一样简单将是非常好的。 但实际上方法签名可能变得不可读。 让我们看下面的例子 public void setTitleVisible( int lenght, String title, boolean visible ) {// Some implementation here } 首先要注意的是按照惯例Java中的方法名称以驼峰形式编写例如 setTitleVisible 。 该名称选择得当并试图描述该方法应该执行的操作。 其次每个参数的名称说明或至少暗示其目的。 为方法参数找到正确的解释性名称非常重要而不是int i String s boolean f 但是在极少数情况下还是有意义的。 第三该方法仅接受三个参数。 尽管Java对允许的参数数量有更高的限制但强烈建议将此数字保持在6以下。除此之外方法签名变得很难理解。 从Java 5发行版开始这些方法可以使用特殊语法具有相同类型的参数变量列表称为varargs例如 public void find( String ... elements ) {// Some implementation here } 在内部Java编译器将varargs转换为相应类型的数组这就是方法实现可以访问varargs的方式。 有趣的是Java还允许使用泛型类型参数声明varargs参数。 但是由于参数的类型未知因此Java编译器希望确保负责任地使用varargs 并建议该方法是final并使用SafeVarargs批注进行批注有关批注的更多详细信息请参见第5部分。教程 以及如何以及何时使用Enums和Annotations 。 例如 SafeVarargs final public T void find( T ... elements ) {// Some implementation here } 另一种方法是使用SuppressWarnings批注例如 SuppressWarnings( unchecked ) public T void findSuppressed( T ... elements ) {// Some implementation here } 下一个示例演示将检查的异常用作方法签名的一部分。 近年来事实证明已检查的异常不如预期的那样有用导致编写更多的样板代码而不是解决的问题。 public void write( File file ) throws IOException {// Some implementation here } 最后但并非最不重要的一点是通常建议但很少使用将方法参数标记为final 。 当用不同的值重新分配方法参数时它有助于摆脱不良的代码实践。 同样匿名类可以使用这种方法参数有关匿名类的更多详细信息在本教程的第3部分“ 如何设计类和接口”中进行了介绍 尽管Java 8通过有效地引入final变量来缓解了这一限制。 3.方法主体 每种方法都有其自己的实现和目的。 但是有一些通用指南确实可以帮助编写清晰易懂的方法。 可能最重要的一个是单一责任原则尝试以这种方式实现方法即每个单一方法都只会做一件事情并且做得很好。 遵循此原理可能会炸毁许多类方法因此找到合适的平衡很重要。 编码和设计时的另一重要事项是保持方法实现的简短通常只需遵循单一职责原则您就可以免费获得它。 简短的方法很容易推论而且它们通常适合一个屏幕因此您的代码读者可以更快地理解它们。 最后但并非最不重要的建议与使用return语句有关。 如果某个方法返回某个值请尝试最大程度地减少调用return语句的位置有些人走得更远建议在所有情况下仅使用单个return语句。 更多的return语句方法变得很难遵循其逻辑流程并修改或重构实现。 4.方法重载 方法重载技术通常用于为不同的参数类型或组合提供方法的专用版本。 尽管方法名称保持不变但是编译器会根据调用点的实际参数值选择正确的替代方法重载的最佳示例是Java中的构造函数名称始终相同但参数集不同或如果找不到将引发编译器错误。 例如 public String numberToString( Long number ) {return Long.toString( number ); }public String numberToString( BigDecimal number ) {return number.toString(); } 方法重载在某种程度上接近于泛型关于泛型的更多详细信息在本教程的第4部分“ 如何以及何时使用泛型”中进行了介绍 但是它在泛型方法不能很好地工作并且每种或大多数泛型使用的情况下使用类型参数需要它们自己的专用实现。 尽管如此将泛型和重载结合起来可能非常强大但是由于类型擦除在Java中通常是不可能的有关更多详细信息请参阅教程的第4部分 如何及何时使用泛型 。 让我们看一下这个例子 public T extends Number String numberToString( T number ) {return number.toString(); }public String numberToString( BigDecimal number ) {return number.toPlainString(); } 尽管可以在不使用泛型的情况下编写此代码段但对于我们的演示目的而言它不是重要的。 有趣的是方法numberToString重载了BigDecimal的专门实现并为所有其他数字提供了通用版本。 5.方法覆盖 在本教程的第3部分“ 如何设计类和接口”中 我们讨论了很多方法重写。 在本节中当我们已经知道方法重载时我们将展示为什么使用Override批注如此重要。 我们的示例将演示简单类层次结构中方法重写和重载之间的细微差别。 public class Parent {public Object toObject( Number number ) {return number.toString();} } Parent类只有一个toObject方法。 让我们对该类进行子类化并尝试提出方法版本以将数字转换为字符串而不是原始对象。 public class Child extends Parent {Overridepublic String toObject( Number number ) {return number.toString();} } 尽管如此 Child类中toObject方法的签名还是有些不同请参见Covariant方法返回类型以获取更多详细信息它确实覆盖了超类中的那个并且Java编译器对此没有任何抱怨。 现在让我们向Child类添加另一个方法。 public class Child extends Parent {public String toObject( Double number ) {return number.toString();} } 同样方法签名之间只有细微的差别用Double代替Number 但是在这种情况下它是方法的重载版本它不会覆盖父方法。 这就是Java编译器和Override注释的帮助得到回报的时候用Override注释上一个示例中的方法会引发编译器错误。 6.内联 内联是Java JIT即时编译器执行的优化目的是消除特定的方法调用并将其直接替换为方法实现。 JIT编译器使用的启发式方法取决于方法的调用频率和大小。 太大的方法不能有效地内联。 内联可以大大提高代码的性能这是使方法保持简短的另一个好处如我们在“ 方法正文 ”一节中所讨论的。 7.递归 Java中的递归是一种方法该方法在执行计算时会调用自身。 例如让我们看下面的示例该示例求和一个数组的数字 public int sum( int[] numbers ) {if( numbers.length 0 ) {return 0;} if( numbers.length 1 ) {return numbers[ 0 ];} else {return numbers[ 0 ] sum( Arrays.copyOfRange( numbers, 1, numbers.length ) );} } 这是一个非常无效的实现但是它很好地证明了递归。 递归方法存在一个众所周知的问题根据调用链的深度它们可能会炸毁堆栈并导致StackOverflowError异常。 但是事情并没有听起来那么糟糕因为有一种技术可以消除栈溢出称为尾部调用优化 。 如果方法是尾部递归的则可以应用此方法尾部递归方法是所有递归调用都是尾部调用的方法。 例如让我们以尾递归的方式重写以前的算法 public int sum( int initial, int[] numbers ) {if( numbers.length 0 ) {return initial;} if( numbers.length 1 ) {return initial numbers[ 0 ];} else {return sum( initial numbers[ 0 ],Arrays.copyOfRange( numbers, 1, numbers.length ) );} } 不幸的是目前Java编译器以及JVM JIT编译器不支持尾部调用优化但是当您用Java编写递归算法时它仍然是了解和考虑的一种非常有用的技术。 8.方法参考 通过将功能性概念引入Java语言Java 8向前迈出了一大步。 其基础是将方法视为数据这是该语言以前所不支持的概念但是由于Java 7JVM和Java标准库已经具有使之成为可能的某些功能。 幸运的是有了方法引用现在就可以了。 参考类型 例 引用静态方法 SomeClass::staticMethodName 引用特定对象的实例方法 someInstance::instanceMethodName 引用特定类型的任意对象的实例方法 SomeType::methodName 引用构造函数 SomeClass::new 表格1 让我们看一个简单的示例该示例说明如何将方法作为参数传递给其他方法。 public class MethodReference {public static void println( String s ) {System.out.println( s );}public static void main( String[] args ) {final Collection String strings Arrays.asList( s1, s2, s3 );strings.stream().forEach( MethodReference::println );} } main方法的最后一行使用对println方法的引用将字符串集合中的每个元素打印到控制台并将其作为参数传递给另一个方法forEach 。 9.不变性 如今不变性已引起了很多关注Java也不例外。 众所周知不变性在Java中很难实现但这并不意味着应将其忽略。 在Java中不变性就是改变内部状态。 作为示例让我们看一下JavaBeans规范 http://docs.oracle.com/javase/tutorial/javabeans/ 。 它非常清楚地表明setter可以修改包含对象的状态而这正是每个Java开发人员所期望的。 但是替代方法不是修改状态而是每次都返回一个新状态。 它并不像听起来那样可怕新的Java 8 Date / Time API 在JSR 310Date and Time API框架下开发就是一个很好的例子。 让我们看一下以下代码片段 final LocalDateTime now LocalDateTime.now(); final LocalDateTime tomorrow now.plusHours( 24 );final LocalDateTime midnight now.withHour( 0 ).withMinute( 0 ).withSecond( 0 ).withNano( 0 ); 每次需要修改其状态的LocalDateTime实例调用都将返回新的LocalDateTime实例并使原始实例保持不变。 与旧的Calendar和Date相比API设计范例发生了很大的变化使用起来不太舒服并且引起很多麻烦。 10.方法文档 在Java中特别是如果您正在开发某种库或框架则应使用Javadoc工具记录所有公共方法 http://www.oracle.com/technetwork/articles/java/index-jsp-135444.html 。 严格来说没有什么可以强迫您执行此操作但是好的文档可以帮助其他开发人员了解特定方法的作用所需的参数其实现所具有的假设或约束异常的类型以及何时可以引发以及返回值如果有可能是加上更多东西。 让我们看下面的例子 /*** The method parses the string argument as a signed decimal integer.* The characters in the string must all be decimal digits, except* that the first character may be a minus sign {code -} or plus* sign {code }.** pAn exception of type {code NumberFormatException} is thrown if* string is {code null} or has length of zero.** pExamples:* blockquotepre* parse( 0 ) returns 0* parse( 42) returns 42* parse( -2 ) returns -2* parse( string ) throws a NumberFormatException* /pre/blockquote** param str a {code String} containing the {code int} representation to be parsed* return the integer value represented by the string* exception NumberFormatException if the string does not contain a valid integer value*/ public int parse( String str ) throws NumberFormatException {return Integer.parseInt( str ); } 对于parse这样的简单方法它是一个非常冗长的文档但是它展示了Javadoc工具提供的一些有用功能包括对其他类的引用示例代码片段和高级格式化。 这是流行的Java IDE之一Eclipse反映此方法文档的方式。 仅通过查看上面的图片任何初级到高级的Java开发人员都可以了解该方法的目的以及使用该方法的正确方法。 11.方法参数和返回值 文档化方法是一件很了不起的事情但是不幸的是当使用不正确或意外的参数值调用方法时它不能阻止用例。 因此根据经验所有公共方法都应验证其自变量并且永远不应相信将始终使用正确的值来指定它们这种模式称为健全性检查。 回到上一节的示例方法parse应该在对其执行任何操作之前执行其唯一参数的验证 public int parse( String str ) throws NumberFormatException {if( str null ) {throw new IllegalArgumentException( String should not be null );}return Integer.parseInt( str ); } Java还有另一个选择可以使用assert语句执行验证和健全性检查。 但是可以在运行时将其关闭并且可能无法执行。 最好始终执行此类检查并提出相关异常。 即使已经记录了方法并验证了它们的参数仍然有一些与它们可以返回的值有关的注释。 在Java 8之前说“我目前没有值”的方法的最简单方法就是返回null 。 这就是Java对于NullPointerException异常如此臭名昭著的原因。 Java 8试图通过引入Optional T 类来解决此问题。 让我们看一下这个例子 public T Optional T find( String id ) {// Some implementation here } Optional T 提供了许多有用的方法并且完全消除了该方法返回null并在各处使用null检查污染代码的需要。 唯一的例外可能是集合。 每当方法返回集合时总是最好返回空的而不是null 甚至是Optional T 例如 publiclt; T gt; Collectionlt; T gt; find( String id ) { return Collections.emptyList(); }12.方法作为API入口点 即使您只是在组织内构建应用程序的开发人员还是对流行的Java框架或库之一的贡献者您正在执行的设计决策在如何使用代码方面都起着非常重要的作用。 尽管API设计指南值得多本书籍但本教程的这一部分涉及其中的许多内容因为方法成为API的切入点因此快速总结将非常有帮助 为方法及其参数使用有意义的名称 方法签名 尝试使参数的数量小于6“ 方法签名”部分 保持方法简短易读“ 方法主体”和“ 内联”一节 始终记录您的公共方法包括前提条件和示例如果有必要的话“ 方法文档”部分 始终执行参数验证和完整性检查“ 方法参数和返回值”部分 尝试转义null作为方法的返回值“ 方法参数和返回值”部分 每当它是有道理的尝试设计不变的方法这不影响内部状态部分不变性 使用可见性和可访问性规则隐藏不应该公开的方法本教程的第3部分 如何设计类和接口 13.接下来是什么 本教程的这一部分讨论的不是Java语言而是更多关于如何有效地使用Java语言特别是通过编写可读干净有文档的有效方法。 在下一节中我们将继续相同的基本思想并讨论通用的编程准则以帮助您成为更好的Java开发人员。 14.下载源代码 这是关于如何有效地编写方法的课程。 您可以在此处下载源代码 advanced-java-part-6 翻译自: https://www.javacodegeeks.com/2015/09/how-to-write-methods-efficiently.html
http://www.huolong8.cn/news/12568/

相关文章:

  • 企业网站托管趋势网站推广怎么做比较好
  • 化妆品网站开发可行性网站域名.xin
  • 作品集制作网站自己买台服务器做网站
  • 网站怎么做双机房切换网站开发软硬件配置
  • 江苏省住房和城乡建设厅官方网站新网免费空间
  • 马尔康网站建设上海网站开发制作公司
  • 下陆区建设局网站西安未央区今天出啥事了
  • 响应式环保网站模板中国香烟网上商城
  • 百度网站管理网站建设建站网易互客
  • 旅游网站开发方案pptWordPress抓取豆瓣
  • 门户网站建设多久建立企业网站的目的和意义
  • 网站域名如何从代理商那里转出来西安哪家公司做网站
  • 梵讯企业网站建设中国进口贸易网官网
  • 常州专业网站建设公司哪家好开发app成本
  • 网站怎么做流量统计肥城网站建设推广
  • 外贸免费开发网站模板乌苏市电力建设工程公司网站
  • 为朋友做的网站舆情处置的五个步骤
  • 网站与网页的关系wordpress非凡主题里导航下拉菜单
  • 做网站免费送域名网站cn域名注册
  • 网站建设必备的功能模块寮步镇仿做网站
  • 丽水市莲都区建设局网站ae模板
  • 路由下做网站映射Wordpress 相同tag
  • iis .net 网站架设做网站反链
  • 做自媒体需要用的网站济宁教育平台网站建设
  • 自己可以建设网站卖东西吗西安网站建设推广公司哪家好
  • 个人备案能做企业网站吗wordpress怎么不调用文字内容
  • 新乡网站建设哪家好wordpress群晖
  • 网站开发json解析wordpress媒体库默认路径
  • 网站怎么做弹幕播放器结合七牛云 做视频网站
  • 做报名表的网站互联网公司简介ppt范本