当前位置:首页 > 科技  > 软件

99%的Java程序员都会写这样的垃圾代码

来源: 责编: 时间:2023-11-13 09:06:41 332观看
导读在软件开发领域,编程经验往往与设计、编码、重构和测试的能力相辅相成。随着时间的推移,这些技能的提升使您能够在日常工作中脱颖而出。然而,有时候我们可能陷入固定的编程模式,导致编码习惯停滞不前。在这篇文章中,我们将

o1f28资讯网——每日最新资讯28at.com

在软件开发领域,编程经验往往与设计、编码、重构和测试的能力相辅相成。随着时间的推移,这些技能的提升使您能够在日常工作中脱颖而出。然而,有时候我们可能陷入固定的编程模式,导致编码习惯停滞不前。在这篇文章中,我们将介绍10个Java编程习惯,它们可以帮助您提高编码技能,写出更加干净、健壮的Java代码。o1f28资讯网——每日最新资讯28at.com

1、调用equals()方法时使用String字面值或已知对象

这条肯定中!很多人以为由于equals()方法是对称的,因此调用 a.equals(b) 与调用b.equals(a)相同的,所以习惯性的这样写:o1f28资讯网——每日最新资讯28at.com

if (givenString.equals("YES")){    // 执行一些操作}

尽管这种写法在可读性上有优势,但它并不安全。如果givenString为null,那么这段代码将抛出NullPointerException。为了避免这种情况,我们应该将equals方法调用放在已知对象的一侧,如下所示:o1f28资讯网——每日最新资讯28at.com

"YES".equals(givenString)

这样,如果givenString为null,它将返回false,而不会抛出异常。这是一种更加安全和健壮的编码习惯,同时也是避免NullPointerException的一种流行方式。o1f28资讯网——每日最新资讯28at.com

2、使用entrySet遍历HashMap

在遍历HashMap时,我们通常会使用键集合(key set)来获取键,并通过键获取对应的值。例如:o1f28资讯网——每日最新资讯28at.com

Set<Key> keySet = map.keySet();for (Key k : keySet){    Value v = map.get(k);    System.out.println(k + ": " + v);}

然而,这种方法需要进行两次查找操作,可能会导致性能下降。如果我们需要同时访问键和值,更好的方式是使用entrySet,如下:o1f28资讯网——每日最新资讯28at.com

Set<Map.Entry<Key, Value>> entrySet = map.entrySet();for (Map.Entry<Key, Value> entry : entrySet){    Key k = entry.getKey();    Value v = entry.getValue();    System.out.println(k + ": " + v);}

这种方式效率更高,因为它直接从entry对象中获取值,而不需要再次查找。o1f28资讯网——每日最新资讯28at.com

3、使用枚举作为单例

想象一下,您需要创建一个线程安全的单例模式。以前,这可能需要大量的代码和同步操作。但现在,您可以使用Java的枚举类型,仅需一行代码即可创建一个线程安全的单例:o1f28资讯网——每日最新资讯28at.com

public enum Singleton{  INSTANCE;}

这个枚举实例在多线程环境下也能保证只有一个实例存在,即使在序列化和反序列化过程中也是如此。这是一种简洁而强大的单例模式的实现方式。o1f28资讯网——每日最新资讯28at.com

4、使用Arrays.asList()或List.of()初始化集合

在Java中,初始化集合时,我们通常会逐个添加元素。例如:o1f28资讯网——每日最新资讯28at.com

List<String> listOfCurrencies = new ArrayList<>();listOfCurrencies.add("USD/AUD");listOfCurrencies.add("USD/JPY");listOfCurrencies.add("USD/INR");

这种方法虽然有效,但相对繁琐。您可以使用Arrays.asList()方法以更简洁的方式初始化集合,如下:o1f28资讯网——每日最新资讯28at.com

List<String> listOfPairs = new ArrayList<>(Arrays.asList("USD/AUD", "USD/JPY", "USD/INR"));

此外,从Java 9开始,您还可以使用List.of()和Set.of()方法来创建不可变的列表和集合。这些方法提供了更好的不可变性保证。o1f28资讯网——每日最新资讯28at.com

List<String> newList = List.of("One", "Two", "Infinity");

5、在循环中检查wait()条件

当我们使用wait()、notify()和notifyAll()方法进行多线程通信时,通常会在if语句中检查等待条件,然后调用wait()。例如:o1f28资讯网——每日最新资讯28at.com

synchronized(queue) {  if(queue.isFull()){    queue.wait();  }}

然而,这种写法存在一个问题,即可能会发生虚假通知(spurious notification)。为了解决这个问题,我们应该将检查等待条件的操作放在一个while循环内,如下:o1f28资讯网——每日最新资讯28at.com

synchronized(queue) {  while(queue.isFull()){    queue.wait();  }}

这样,即使在通知之前等待条件再次被满足,我们的代码也可以正确地工作。o1f28资讯网——每日最新资讯28at.com

6、捕获CloneNotSupportedException并返回子类实例

在Java中,对象克隆的实现机制常常受到批评,因为它的性能不佳。如果您需要实现clone()方法,可以使用以下习惯来减轻这种痛苦:o1f28资讯网——每日最新资讯28at.com

public Course clone() {   Course c = null;   try {     c = (Course)super.clone();   } catch (CloneNotSupportedException e) {} // 不会发生   return c;}

这个习惯利用了clone()方法实际上不会抛出CloneNotSupportedException的事实,只要类实现了Cloneable接口。这种方式返回了子类的实例,被称为协变方法覆盖(covariant method overriding),从Java 5开始支持。这可以减少客户端代码中的类型强制转换,使代码更加清晰。o1f28资讯网——每日最新资讯28at.com

7、在可能的情况下使用接口

在定义方法的返回类型、变量类型或方法参数类型时,应尽量使用接口而不是具体o1f28资讯网——每日最新资讯28at.com

的类。例如,不要这样写:o1f28资讯网——每日最新资讯28at.com

ArrayList<Integer> listOfNumbers = new ArrayList<>();public ArrayList<Integer> getNumbers(){    return listOfNumbers;}public void setNumbers(ArrayList<Integer> numbers){    listOfNumbers = numbers;}

而应该这样写:o1f28资讯网——每日最新资讯28at.com

List<Integer> listOfNumbers;public List<Integer> getNumbers(){    return listOfNumbers;}public void setNumbers(List<Integer> numbers){    listOfNumbers = numbers;}

这种方式提供了更大的灵活性,可以传递不同的集合实现。您还可以使用泛型中的通配符扩展功能,进一步提高灵活性。o1f28资讯网——每日最新资讯28at.com

public void processList(List<? extends Number> numbers){    // 执行操作}

8、使用迭代器遍历List

在Java中,有多种遍历List的方法,包括使用索引的for循环、增强的for循环和迭代器。最佳实践是使用迭代器,因为它是一种安全且能够防止不可预测行为的方法:o1f28资讯网——每日最新资讯28at.com

Iterator<String> iterator = list.iterator();while(iterator.hasNext()){    String name = iterator.next();    // 执行操作}

使用迭代器的好处包括能够遍历不同实现的List,例如ArrayList和LinkedList,同时避免了多线程环境下的问题。o1f28资讯网——每日最新资讯28at.com

9、在编写代码时考虑依赖注入

在以前的编程实践中,我们常常会硬编码依赖关系,例如:o1f28资讯网——每日最新资讯28at.com

public Game {    private HighScoreService service = HighScoreService.getInstance();    public void showLeaderBoard(){        List<Player> listOfTopPlayers = service.getLeaderBoard();        System.out.println(listOfTopPlayers);    }}

这种方式使Game类与HighScoreService类紧密耦合,不容易进行单元测试,因为必须使用HighScoreService的实际实现。为了避免这个问题,我们应该使用依赖注入,将依赖作为构造函数参数传递:o1f28资讯网——每日最新资讯28at.com

public Game {    private HighScoreService service;    public Game(HighScoreService service){        this.service = service;    }    public void showLeaderBoard(){        List<Player> listOfTopPlayers = service.getLeaderBoard();        System.out.println(listOfTopPlayers);    }}

这种方式使代码更加可测试,可以轻松地使用模拟对象进行测试。o1f28资讯网——每日最新资讯28at.com

10、在它们自己的try块中关闭流

在处理输入流和输出流时,我们经常需要进行异常处理和关闭操作。以前,我们可能会这样写:o1f28资讯网——每日最新资讯28at.com

InputStream is = null;OutputStream os = null;try {     is = new FileInputStream("application.json");    os = new FileOutputStream("application.log");} catch (IOException io) {} finally {    is.close();     os.close();}

然而,这种方式存在一个问题,如果第一个流的操作抛出异常,第二个流将永远不会被关闭。为了解决这个问题,我们可以使用Java 7引入的try-with-resources语法,更加简洁地处理流的关闭操作:o1f28资讯网——每日最新资讯28at.com

try (InputStream is = new FileInputStream("application.json");     OutputStream os = new FileOutputStream("application.log")) {    // 读取输入流并写入输出流的操作} catch (IOException e) {    // 异常处理代码}

使用try-with-resources后,不需要再手动关闭流,它们会在try块结束时自动关闭。这样的写法更加简洁和安全。o1f28资讯网——每日最新资讯28at.com

结语

这些Java编程习惯可以帮助您写出更加高效、健壮的Java代码,提高编码技能。如果您是刚刚开始学习Java或已经有一到两年的经验,这些习惯将为您打开Java编程的新视角。随着Java版本的不断更新,一些习惯可能会被更好的API方法所取代,但掌握它们仍然比不掌握更好。如果您还知道或遵循其他Java编程习惯,欢迎在评论中分享,我们期待从有经验的读者那里学习。希望这些习惯对您的Java编程之旅有所帮助。o1f28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-22475-0.html99%的Java程序员都会写这样的垃圾代码

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 五个提高Java代码安全性的VS Code插件

下一篇: Python开发者的宝典:CSV和JSON数据处理技巧大公开!

标签:
  • 热门焦点
  • 跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    8月5日消息,Redmi K60至尊版将于8月发布,在此前举行的战略发布会上,官方该机将搭载搭载天玑9200+处理器,安兔兔V10跑分超177万分,是目前安卓阵营最高的分数
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人&ldquo;珍藏&rdquo;是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了&ldquo;本地生活&rdquo;入口,位置较深,位于首页的&ldquo;充值中心&rdquo;内,目前主要售卖美食相关的
  • 支持aptX Lossless无损传输 iQOO TWS 1赛道版发布限时优惠价369元

    2023年7月4日,“无损音质,声动人心”iQOO TWS 1正式发布,支持aptX Lossless无损传输,限时优惠价369元。iQOO TWS 1耳机率先支持端到端aptX Lossless无
Top