iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java开发常用规范技巧有哪些
  • 886
分享到

Java开发常用规范技巧有哪些

2023-06-02 16:06:19 886人浏览 薄情痞子
摘要

本篇内容主要讲解“Java开发常用规范技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java开发常用规范技巧有哪些”吧!1、Object 的 equals 方法容易抛空指针异常。从源码

本篇内容主要讲解“Java开发常用规范技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java开发常用规范技巧有哪些”吧!

1、Object 的 equals 方法容易抛空指针异常。

源码来进行分析equals方法是属于Object类的,如果调用方为null,那么自然在运行的时候会抛出空指针异常的情况。

object类中的源码:

从源码来进行分析equals方法是属于Object类的,如果调用方为null,那么自然在运行的时候会抛出空指针异常的情况。

object类中的源码:

    public boolean equals(Object obj) {

        return (this == obj);

    }

为了避免这种现况出现,在比对的时候尽量将常量或者有确定值的对象置前。

例如说:

正确:“test”.equals(object);

错误:object.equals(“test”);

 2、类的命名使用驼峰式命名的规范。

例如:UserService,但是以下情景例外:DO / BO / PO / DTO / VO。

例如说:UserPO,StudentPO(PO,VO,DTO,等这类名词需要全大写)

@Data

@Builder

public class CustomBodyDTO {

    private String name;

    private String idCode;

    private String status;

}

  1. 如果在模块或者接口,类,方法中使用了设计模式,那么请在命名的时候体现出来。例如说:TokenFactory,LoginProxy等。

public class TokenFactory {

    public TokenDTO buildToken(LoginInfo loginInfo) {

        String token = UUID.randomUUID().toString();

        TokenDTO tokenDTO = TokenDTO.builder()

                .token(token)

                .createTime(LocalDateTime.now())

                .build();

        String redisKey = RedisKeyBuilder.buildTokenKey(token);

        redisService.setObject(redisKey, loginInfo, Timeout.ONE_DAY * 30 * 2);

        log.info("创建token成功|loginInfo={}", loginInfo.toString());

        return tokenDTO;

    }

}

4、对于所有相同类型的包装类进行比较的时候,都是用equal来进行操作。

对于Integer类来说,当相应的变量数值范围在-128到127之间的时候,该对象会被存储在IntegerCache.cache里面,因此会有对象复用的情况发生。

所以对于包装类进行比较的时候,最好统一使用equal方法。

private static class IntegerCache {

        static final int low = -128;

        static final int high;

        static final Integer cache[];

        static {

            // high value may be configured by property

            int h = 127;

            String integerCacheHighPropValue =

                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

            if (integerCacheHighPropValue != null) {

                try {

                    int i = parseInt(integerCacheHighPropValue);

                    i = Math.max(i, 127);

                    // Maximum array size is Integer.MAX_VALUE

                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);

                } catch( NumberFORMatException nfe) {

                    // If the property cannot be parsed into an int, ignore it.

                }

            }

            high = h;

            cache = new Integer[(high - low) + 1];

            int j = low;

            for(int k = 0; k < cache.length; k++)

                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)

            assert IntegerCache.high >= 127;

        }

        private IntegerCache() {}

    }

  public static Integer valueOf(int i) {

        if (i >= IntegerCache.low && i <= IntegerCache.high)

            return IntegerCache.cache[i + (-IntegerCache.low)];

        return new Integer(i);

}

5、所有的pojo类中的属性最好统一使用包装类属性类型数据。rpc方法的返回值和参数都统一使用包装类数据。局部变量中使用基本的数据类型。

对于实际的应用场景来说,例如说一个学生类,当我们设置里面的成绩字段为int类型的时候,如果学生没有考试,那么这个成绩字段应该为空,但是int默认会赋值为0,那么这个时候使用基本数据类型就容易产生误区,到底是考了0分,还是说没有参加考试。

如果换成使用包装类Integer类型的话,就可以通过null值来进行区分了。

6、当pojo类在进行编写的时候要重写相应的toString方法,如果该pojo中继承了另外的一个pojo类,那么请在相应的tostring函数中加入super.toString()方法。

通过重写toString方法有利于在日志输出的时候查看相应对象的属性内容进行逐一分析,对于一些有继承关系的对象而言,加入了super.toString方法更加有助于对该对象的理解和分析。

7、在pojo的getter和setter方法里面,不要增加业务逻辑的代码编写,这样会增加问题排查的难度。

正确做法:

public class User {

    private Integer id;

    private String username;

    public Integer getId() {

        return id;

    }

    public User setId(Integer id) {

        this.id = id;

        return this;

    }

    public String getUsername() {

        return username;

    }

    public User setUsername(String username) {

        this.username = username;

        return this;

    }

}

8、final 可以声明类、成员变量、方法、以及本地变量。

下列情况使用 final 关键字:

不允许被继承的类,如:String 类。

不允许修改引用的域对象,如:POJO 类的域变量。

不允许被重写的方法,如:POJO 类的 setter 方法。

不允许运行过程中重新赋值的局部变量。

避免上下文重复使用一个变量,使用 final 描述可以强制重新定义一个变量,方便更好地进行重构。

9、对于任何类而言,只要重写了equals就必须重写hashcode。

举例说明:

1)HashSet在存储数据的时候是存储不重复对象的,这些对象在进行判断的时候需要依赖hashcode和equals方法,因此需要重写。

2)在自定义对象作为key键时,需要重写hashcode和equals方法,例如说String类就比较适合用于做key来使用。

10、不要在 foreach 循环里进行元素的 remove/add 操作。

remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加

Iterator<String> iterator = list.iterator();

while (iterator.hasNext()) {

String item = iterator.next();

if (删除元素的条件) {

iterator.remove();

}

}

11、使用HashMap的时候,可以指定集合的初始化大小。

例如说,HashMap里面需要存放10000个元素,但是由于没有进行初始化大小操作,所以在添加元素的时候,hashmap的内部会一直在进行扩容操作,影响性能。

那么为了减少扩容操作,可以在初始化的时候将hashmap的大小设置为:已知需要存储的大小/负载因子(0.75)+1

HashMap hashMap=new HashMap<>(13334);

Map类集合中,K/V对于null类型存储的情况:

集合名称

key

value

说明

HashMap

允许为null

允许为null

线程安全

TreeMap

不允许为null

允许为null

线程不安全

HashTable

不允许为null

不允许为null

线程安全

ConcurrentHashMap

不允许为null

不允许为null

线程安全

13、可以利用 Set 元素唯一的特性,可以快速对一个集合进行去重操作,避免使用 List 的contains 方法进行遍历、对比、去重操作。

通关观察可以发现,HashSet底层通过将传入的值再传入到一个HashMap里面去进行操作,进入到HashMap里面之后,会先通过调用该对象的hashcode来判断是否有重复的值,如果有再进行equals判断,如果没有相同元素则插入处理。

   public boolean add(E e) {

        return map.put(e, PRESENT)==null;

    }

14、线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

错误做法:

ExecutorService executors = Executors.newSingleThreadExecutor();

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);

对于线程池的参数需要有深入的理解后,结合实际的机器参数来进行参数设置,从而防止在使用中出现异常。

ExecutorService fixedExecutorService = new ThreadPoolExecutor(

                1,

                2,

                60,

                TimeUnit.SECONDS,

                 linkedBlockingQueue,

                new MyThreadFactory(),

                new ThreadPoolExecutor.AbortPolicy()

        );

ps:使用Executors.new方式创建线程池的缺点:

对于FixedThreadPool 和 SingleThreadPool而言

允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。

对于CachedThreadPool 和 ScheduledThreadPool而言

允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。

到此,相信大家对“Java开发常用规范技巧有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Java开发常用规范技巧有哪些

本文链接: https://www.lsjlt.com/news/230709.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java开发常用规范技巧有哪些
    本篇内容主要讲解“Java开发常用规范技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java开发常用规范技巧有哪些”吧!1、Object 的 equals 方法容易抛空指针异常。从源码...
    99+
    2023-06-02
  • Redis开发规范有哪些
    这篇文章主要介绍“Redis开发规范有哪些”,在日常操作中,相信很多人在Redis开发规范有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis开发规范有哪些”的疑惑...
    99+
    2024-04-02
  • INFORMATICA 开发规范有哪些
    INFORMATICA 开发规范有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  ETL研发运维责任人界定 &nbs...
    99+
    2024-04-02
  • MySQL有哪些开发规范
    这期内容当中小编将会给大家带来有关MySQL有哪些开发规范,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 #MySQL开发规范 ##命名规范 ...
    99+
    2024-04-02
  • mongodb开发规范有哪些
    1. 命名规范:- 集合(Collection)名应使用小写字母和下划线组成,如:users, orders。- 字段(Field)...
    99+
    2023-09-04
    mongodb
  • MySQL开发规范有哪些
    这篇文章将为大家详细讲解有关MySQL开发规范有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。基础规范使用innodb存储引擎表字符集使用utf-8所有表添加注释单表...
    99+
    2024-04-02
  • python开发规范有哪些
    Python开发规范通常包括以下几个方面:1. 命名规范:使用有意义的变量、函数和类名,采用下划线命名法(例如:my_variabl...
    99+
    2023-09-22
    python
  • 数据库规范化技巧有哪些
    这篇文章给大家介绍数据库规范化技巧有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。  数据库规范化有哪些技巧  在设计表之前,应明确您打算如何处理数据,还要了解随着时间的推移数据会...
    99+
    2024-04-02
  • Redis的开发规范有哪些
    本篇内容主要讲解“Redis的开发规范有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis的开发规范有哪些”吧!一、键值设计1、key名设计可读性和可...
    99+
    2024-04-02
  • 前端开发中常用技巧有哪些
    这篇文章主要为大家展示了“前端开发中常用技巧有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“前端开发中常用技巧有哪些”这篇文章吧。文章标题列表中日期居右显示的方法: 代码如下:<p&g...
    99+
    2023-06-08
  • MySQL开发设计规范有哪些
    这期内容当中小编将会给大家带来有关MySQL开发设计规范有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。命名规范 l  库名、表名、字段名禁止超过32个...
    99+
    2024-04-02
  • PHP开发内部规范有哪些
    本篇内容介绍了“PHP开发内部规范有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!       ...
    99+
    2023-06-25
  • Web前端开发规范有哪些
    这篇文章给大家介绍Web前端开发规范有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。基本准则符合web标准, 语义化html, 结构表现行为分离, 兼容性优良. 页面性能方面, 代...
    99+
    2024-04-02
  • 前端开发的规范有哪些
    这篇文章主要介绍“前端开发的规范有哪些”,在日常操作中,相信很多人在前端开发的规范有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”前端开发的规范有哪些”的疑惑有所帮助!接...
    99+
    2024-04-02
  • MySQ设计与开发规范有哪些
    这篇文章主要介绍了MySQ设计与开发规范有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQ设计与开发规范有哪些文章都会有所收获,下面我们一起来看看吧。数据库对象命名规...
    99+
    2024-04-02
  • MySQL数据库开发规范有哪些
    这篇文章给大家介绍MySQL数据库开发规范有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。关于MySQL数据库开发规范有哪些就分享到这里了,希望以上内容可以对大家有一定的帮助,可以...
    99+
    2024-04-02
  • WEBAPP开发技巧有哪些
    本篇内容主要讲解“WEBAPP开发技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“WEBAPP开发技巧有哪些”吧!要响应式开发web,也就是页面必须自适应屏幕大小,可以采用流体布局,如之...
    99+
    2023-06-08
  • Vue开发技巧有哪些
    Vue开发技巧有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。路由参数解耦一般在组件内使用路由参数,大多数人会这样做:export&nbs...
    99+
    2024-04-02
  • JS开发技巧有哪些
    这篇文章主要为大家展示了“JS开发技巧有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS开发技巧有哪些”这篇文章吧。常用 JS 函数1.时间格式化界面展示...
    99+
    2024-04-02
  • Python有哪些开发技巧
    这篇文章主要讲解了“Python有哪些开发技巧”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python有哪些开发技巧”吧! 1. 如何在运行状态查看源代码查看函数的源代码,我们通...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作