代码简介规范之道——一次教会你如何规范代码

你如何看待代码规范? 代码规范的本质:它不是"审美偏好",而是工程化协作的基础设施;核心要素详解:命名、格式、注释、架构等维度的具体规范与设计原则;团队落地指南:从0到1制定规范、处理冲突、推动执行的全流程;自动化工具链:如何用ESLint/Prettier/IDE配置实现"规范即代码";进阶实践:大型项目的规范演进、跨语言统一、AI时代的规范新形态。代码规范(Code Specification/Style Guide)是一套约束代码编写方式的规则集合。 阅读详情

目录

前言

卫语句

代码:

小函数

迪米特法则

概念:

代码:

Map 提取对象

Stream

多态

反射

最后


前言

在我们平常开发过程中,由于项目时间紧张,代码可以用就好,往往会忽视代码的质量问题。甚至有些复制粘贴过来,不加以整理规范。往往导致项目后期难以维护,更别说后续接手项目的人。所以啊,我们要编写出规范的代码,岂不美哉?

下面分享一些我在开发中常用的编码中小建议,如有不妥,欢迎大家一起交流学习。

加我微信分享学习资料大礼包给你,备注999(记得备注,不然可能会忘记送你资源了)

或者加QQ群我们一起交流:731892759
免费领取三套价值3000元的80G学习资料包
1、Java自学超详细电子书
2、自录优质网络直播课
3、大厂Java面试题
                   

   微信


卫语句

卫语句,就是把复杂的条件表达式拆分成多个条件表达式。比如 多个 if-elseif-else 嵌套, 可以拆分成多个 if。如下面代码

代码:


-------------------- before  --------------------

public void today() {
    if (isWeekend()) {
        if (isFee()) {
            System.out.println("study Android");
        } else {
            System.out.println("play a game");
        }
    } else {
        System.out.println("go to work");
    }
}


 -------------------- after  (建议) --------------------

public void today() {

    // 提前过滤掉`特殊情况`
    if (!isWeekend()) {
        System.out.println("go to work");
        return; // 提前return
    }

    //提前过滤掉`特殊情况`
    if (isFee()) {
        System.out.println("study Android");
        return; // 提前return
    }

    // 更关注于 `核心业务`代码实现。
    System.out.println("play a game");
}

提前过滤掉特殊情况,更关注核心业务逻辑

小函数

我们平常开发的时候,应该编写小而美函数,避免函数过长。一般函数最好在15行以内(建议) 我们看看下面代码:


-------------------- before  --------------------

if (age > 0 && age < 18){
    System.out.println("小孩子");
}

if (number.length() == 11){
    System.out.println("符合手机号");
}

-------------------- after (建议) --------------------

private static boolean isChild(int age) {
    return age > 0 && age < 18;
}

private static boolean isPhoneNumber(String number) {
    return number.length() == 11;
}

if (isChild(age)){
    System.out.println("小孩子");
}

if (isPhoneNumber(number)){
    System.out.println("符合手机号");
}

把判断语句抽取成一个个小函数, 这样代码更加清晰明了。

迪米特法则

概念:

迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解。例如 当一条语句中 一个对象出现两个 . (student.getName().equals("张三")) 就是代码坏味道的表现,如下代码所示。

代码:


-------------------- before  --------------------

public class Student {

    private String name;

    public Student(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public static void main(String[] args) {

    Student student = new Student("张三");

    // 注意看这里,
    // 这里获取 student的name属性,在根据name属性进行判断
    if (StringUtils.isNotBlank(student.getName()) && student.getName().equals("张三")) {
        System.out.println("我的好朋友是 " + student.getName());
    }
}


 -------------------- after (建议) --------------------
 
 public class Student {

    ... 省略name代码

    // 新增一个 判断是否是我的好朋友方法
    public boolean isGoodFriend(){
        return StringUtils.isNotBlank(this.name) && this.name.equals("张三");
    }
}

public static void main(String[] args) {

    Student student = new Student("张三");

    // 根据迪米特法则,把判断逻辑,抽取到 Student 内部,暴露出方法(isGoodFriend)
    if (student.isGoodFriend()){
        System.out.println("我的好朋友是 " + student.getName());
    }
}

IDEA/Android Studio 抽取方法快捷键: option + command + M

Map 提取对象

我们在平常开发中,会使用到map,但是在面向对象开发理念中,一个 map的使用,往往就会错过了 Java Bean。建议使用 Java Bean 更直观。如下代码:

public static void main(String[] args) {

    -------------------- before  --------------------
        Map<String, String> studentMap = new HashMap<>();
        studentMap.put("张三", "男");
        studentMap.put("小红", "女");
        studentMap.put("李四", "男");

        studentMap.forEach((name, sex) -> {
            System.out.println(name + " : " + sex);
        });

    -------------------- after (建议)  --------------------
    
        List<Student> students = new ArrayList<>();
        students.add(new Student("张三", "男"));
        students.add(new Student("小红", "女"));
        students.add(new Student("李四", "男"));

        for (Student student : students) {
            System.out.println(student.getName() + ":" + student.getSex());
        }
    }

笔者在编写这点时候,有所顾虑。肯定有小伙伴跳出来说,map 和 bean 不是一样吗?用map 我还可以省去思考如何命名Class呢。但是从代码规范来说,这样代码设计不是更符合 Java 面向对象的思想吗?

Stream

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。使得代码调用起来更加优雅~ 直接来看代码:

public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("张三", "男"));
        students.add(new Student("李四", "男"));
        students.add(new Student("小红", "女"));
        students.add(new Student("小花", "女"));
        students.add(new Student("小红", "女"));
        
        -------------------- before  --------------------
        //统计男生个数
        //传统的 for each 循环遍历
        long boyCount = 0;
        for (Student student : students) {
            if (student.isBoy()) {
                boyCount++;
            }
        }

        System.out.println("男生个数 = " + boyCount);

        -------------------- after (建议)  --------------------

        //统计男生个数
        //stream 流遍历
        long count = students.stream()
                .filter(Student::isBoy) // 等同于.filter(student -> student.isBoy())
                .count();
                
        System.out.println("男生个数 = " + boyCount);
}

相比与 传统的 For 循环,更推荐大家使用 stream 遍历。 stream 流的链式调用,还有许多骚操作,如 sorted, map, collect等操作符,可以省去不必要if-else,count等判断逻辑。

多态

Java 三大特性之一,多态,相信大家都不会陌生,多态的好处就是根据对象不同类型采取不同的的行为。我们常常在编写 switch 语句的时候,如果改用多态,可以把每个分支,抽取到一个子类内的覆写函数中,这就更加灵活。

我们有这样一个需求,编写一个简单计算器方法,我们先来看一小段代码:


    -------------------- before  --------------------
    public static int getResult(int numberA, int numberB, String operate) {
        int result = 0;
        switch (operate) {
            case "+":
                result = numberA + numberB;
                break;
            case "-":
                result = numberA - numberB;
                break;
            case "*":
                result = numberA * numberB;
                break;
            case "/":
                result = numberA / numberB;
                break;
        }
        return result;
    }
    
    -------------------- after (建议)  --------------------
    
    abstract class Operate {
        abstract int compute(int numberA, int numberB);
    }
    
    class AddOperate extends Operate {

        @Override
        int compute(int numberA, int numberB) {
            // TODO 在这里处理相关逻辑
            return numberA + numberB;
        }
    }
    
    ... SubOperate, MulOperate, DivOperate 也和 AddOperate一样这里就不一一贴出
    
    public static int getResult(int numberA, int numberB, String operate) {
        int result = 0;
        switch (operate) {
            case "+":
                result = new AddOperate().compute(numberA, numberB);
                break;
            case "-":
                result = new SubOperate().compute(numberA, numberB);
                break;
            case "*":
                result = new MulOperate().compute(numberA, numberB);
                break;
            case "/":
                result = new DivOperate().compute(numberA, numberB);
                break;
        }
        return result;
    }

有小伙伴可能会说,你这不是更复杂了吗?

对比起单纯的switch,我们可以这样理解:

  • 虽然在类上有所增加,但是通过多态,把对应操作的逻辑分离出来,使得代码耦合度降低。
  • 如果要修改对应加法的逻辑, 我们只需要修改对应 AddOperate类就可以了。避免直接修改getResult 方法
  • 代码可读性更好,语义更加明确。

但是这里会存在一些问题,如果我们新增一个平方根,平方等计算方式, 就需要修改 switch 里面的逻辑,新增一个条件分支。下面我们再来看看更进一步的优化。

反射

通过上面例子,我们可以进一步优化,通过反射生成对应的 Class,然后在调用compute方法。如下代码:

public static <T extends Operate> int getResult(int numberA, int numberB, Class<T> clz) {
        int result = 0;
        try {
            return clz.newInstance().compute(numberA, numberB);
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
            return result;
        }
}


public static void main(String[] args) {
    // 调用的时候直接传递 class 即可
    System.out.println(getResult(1, 2, SumOpearte.class));
}

根据传入 class 参数,然后生成对应 Opearte处理类, 对比多态方式,我们这里采用反射,使得代码耦合度大大降低,如果在增加平方根,平方等计算方式。我们只需要 新增一个 class 继承 Opearte 即可,getResult 不用做任何修改。

需要注意的是,不是所有switch语句都需要这样替换, 在面对简单的 switch语句,就不必要了, 避免过度设计的嫌疑。如下代码:

public String getResult(int typeCode) {
        String type = "";
        switch (typeCode) {
            case 0:
                type = "加法";
                break;
            case 1:
                type = "减法";
                break;
            case 2:
                type = "乘法";
                break;
            case 3:
                type = "除法";
                break;
        }
        return type;
}

测试代码质量的唯一方式:别人看你代码时说 f * k 的次数。

代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好基础。

掌握Java代码质量度量的自动化之道——从收集到分析的全流程指南 通过本文的学习,你应该已经掌握了如何使用多种工具自动化地收集和分析Java代码质量度量数据的方法。无论是SonarQube的强大功能,还是Checkstyle、PMD和JaCoCo提供的特定领域支持,这些工具都能为你的项目带来巨大的价值。希望这篇文章能够激发你的兴趣,并为你的日常开发工作带来实质性的改进。 阅读详情

相关推荐

从仿真到部署:基于ROS2与Gazebo的UR5e机械臂全流程控制实践

本文详细介绍了基于ROS2与Gazebo的UR5e机械臂全流程控制实践,从环境准备、模型构建到控制器开发和仿真优化,最终实现真实机器人部署。通过实战案例和避坑指南,帮助开发者掌握机器人仿真与控制的关键技术,提升UR5e机械臂在物料分拣等任务中的性能与稳定性。

weixin_29184371的博客 288

代码简洁之道(译)

相同类型的变量使用相同的词 Bad: Good: 使用可搜索/定位的名称 Bad: Good: 使用解释性变量 Bad: Good: 避免隐式映射 Bad: Good: 不要添加不需要的内容 Bad: Good: 使用默认参数,而不是判断或条件 默认参数通常更简洁。请注意,如果使用它们,函数只会为未定义的参数提供默认值。其他“假”值,如“,”,false, null, 0和NaN,将不会被默认值替换。 Bad: Good: 函数 函数参数(理想情况下2个或更少) 限制函数参数的数量是非...

goodloving的博客 2641

对LSTM中每个batch都初始化隐含层的理解

不知道有没有人和我有一样疑惑 在LSTM相关的代码中,为什么每个batch都会将隐藏层重新初始化, 这样不会把以前训练出来的参数丢掉吗?? 比如 代码来自GitHub 看了一些解释是h与c是状态,不是参数,每个batch中都需要初始化为0,LSTM 中的参数是W,b。 网络中训练的是参数,不是状态。 说真的。。。当时我没怎么看懂。。。 咨询了实验室的师兄后,我有了自己的理解 产生误解的主要原因是我对RNN和LSTM的结构理解不深入,我们通常看到RNN结构图基本都是这样的 ...

Chauncey_Wang的博客 5910

[解锁新姿势] 兄dei,你代码需要优化了

黑客(程序员)也是创作者,与画家、建筑师、作家一样。 ——《黑客与画家》 前言 在我们平常开发过程中,由于项目时间紧张,代码可以用就好,往往会忽视代码的质量问题。甚至有些复制粘贴过来,不加以整理规范。往往导致项目后期难以维护,更别说后续接手项目的人。所以啊,我们要编写出优雅的代码,方便你我他,岂不美哉? 下面分享一些我在开发中常用的编码中小建议,如有不妥,欢迎大家一起交流学习。 卫语...

HyZhan的博客 401

生态学家都在用的MixSIAR:用R语言搞定稳定同位素混合模型(从数据整理到结果解读)

本文详细介绍了生态学家常用的MixSIAR工具,通过R语言实现稳定同位素混合模型分析,从数据整理到结果解读全流程。文章涵盖环境准备、模型构建、参数设置、运行诊断及可视化等关键步骤,帮助研究者科学分析河口鱼类食物来源,适用于生态学研究和湿地保护政策制定。

weixin_28683065的博客 437

网络变压器等效电路及网络变压器中间抽头作用详解

       华强盛电子导读:要详细了解网络变压器周边EMC管控及网络变压器BOB-SMITH电路的连接原理,首先我们对网络变压器的认识及其电路各参数影响都要有个简要的认识,本文,对非理想网络变压器等效电路做一个详细的分析,其中重点讨论一下网络变压器中间抽头的作用其影响                          网络变压器等效电路及                        ...

网络变压器专业资料 6005

【规范】代码编写规范

*用业务语言写代码。**这里业务语言,指的是描述的语言,应该更倾向于业务而不是技术维度。**编写可维护的代码要使用业务语言。**如何判断是否使用的是业务语言呢?将语言给业务成员看,如果能看懂,则表示使用的业务语言已经符合标准了。**建立团队词汇表。**使团队业务对于业务有共同理解,不至于出现一个变量含义多种命名方式。如果命名不确定,可以在业务层面进行更深的讨论。好的命名,是体现业务含义的命名。**制定代码规范。**比如,类名要用名词,函数名要用动词或动宾短语;

雨下一整晚real的博客 3620

零基础用AHK操作Excel:从数据读取到自动填写(附完整脚本解析)

本文为零基础用户详细介绍了如何使用AutoHotkey(AHK)通过COM接口高效操作Excel,实现从数据自动读取到填写的完整自动化流程。文章包含完整的脚本解析、环境搭建指南、核心代码逐行讲解以及实际应用案例,帮助办公人员大幅提升数据处理效率,告别重复劳动。

weixin_29202213的博客 553

代码简洁之道总结

** 第一章整洁代码** 1、为什么要写整洁的代码?(为什么) 因为糟糕复杂的代码,对系统的后续维护会造成很大的麻烦,甚至需要重构,使得生产力下降 读代码与写代码的时间比例为10:1 ,读代码的时间明显比写代码时间长,所以写好整洁的代码也会提高后续开发的效率。 复杂混乱的代码,会给后续开发者带来压力,没有精力进行维护和改造糟糕代码,甚至逼迫继续造成混乱,恶性循环 2、什么才算整洁的代码?(是什么) 1)整洁的代码只做好一件事,一个方法、一个类只做自己的事(单一职责原则?避免受到四周细节干扰) 2)减少重复代

Esy_Hong 1630

基于LSTM语义分析的企业风险预测系统

在数字化时代,企业面临着前所未有的挑战和机遇,而风险管理作为确保企业稳定发展的关键一环,其重要性日益凸显。为了及时、准确地监测和分析企业相关的风险,并预测可能带来的风险,本文介绍了一种基于长短期记忆(LSTM)语义分析的企业风险预测系统。该系统利用深度学习技术,通过将收集到的企业数据进行预处理和分析,结合LSTM模型对文本进行深度语义分析,从而实现对潜在风险的预测和评估。系统设计方面,该系统包括数据预处理、LSTM模型构建与训练、风险预测以及可视化展示等模块。

qiufangtaowvnyyidtf的博客 1392

MoveIt2项目想换掉KDL求解器?试试这个trac_ik插件(附源码编译避坑指南)

本文详细介绍了如何在MoveIt2项目中用trac_ik插件替代KDL求解器,提升机械臂运动学求解的效率和成功率。内容涵盖环境准备、源码编译避坑、项目集成及性能调优,特别适合需要高精度控制的协作机械臂应用场景。通过实测数据对比,trac_ik在求解时间和奇异点处理上显著优于传统KDL求解器。

weixin_30730053的博客 692

45个写规范代码的小技巧

代码规范小技巧

weixin_43889788的博客 3282

0基础学习diffusion_model扩散模型【易理解的公式推导】Denoising Diffusion Probabilistic Models

去噪扩散概率模型。本文是笔者在学习扩散模型时的一些笔记与心得,在公式推导过程中能够保证自己是一步一步去推导并且理解了的。概述是我认为比较重要的部分能够帮助理解公式的推导,具体的公式推导在每一小节中进行。1、扩散过程:如上图所示,扩散过程为从右到左X0→XTX0​→XT​的过程,表示对图片逐渐加噪,且Xt1X_{t+1}Xt1​是在XtX_{t}Xt​加躁得到的,其只受XtX_{t}Xt​的影响,因此扩散过程是一个马尔科夫过程。X0X_0。

zik的博客 2397

代码整洁之道——坏味道

《clean code》中对一些代码中坏味道(bad smell)的总结,在编写代码的过程中应该多注意不要出现列表中的问题,使代码具有更高的可读性。 欢迎大家来我的个人博客玩耍~ https://xuchang-x.github.io/ 转载请注明出处:https://blog.youkuaiyun.com/weixin_37587973/article/details/110137123 环境 需要多步才能做到的环境 构建系统应该可以用单个命令运行,其本身应该是单步的小操作,但不应该依赖一系列指令或环境依赖脚本,

weixin_37587973的博客 606

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

代码整洁之道——如何写出整洁高效的代码

适合初学者和对代码规范一知半解的朋友

weixin_49808281的博客 2592

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

代码整洁之道——命名与函数

有意义的命名 做有意义的区分 不要以数字系列命名    没有提供导向作者意图的线索。如public void copyChars(char a1[], char a2[]) 如果将参数名改成source和destination,就会像样许多。 不要使用有相同意义的名字    如ProductInfo和ProductData类,很难区分两者的区别。 使用读得出来

candycat 3296

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

代码整洁之道——优雅注释之道

一、Best Practice 注释应该声明代码的高层次意图,而非明显的细节 反例 说明 上文方法用于根据参数生成签名,注释中详细描述了签名算法的实现步骤,这其实就是过度描述代码明显细节 正例 总结 注释一定是表达代码之外的东西,代码可以包含的内容,注释中一定不要出现 如果有必要注释,请注释意图(why),而不要去注释实现(how),大家都会看代码 在文件/类级...

AlbenXie的博客 531

代码整洁之道——代码编写原则

《clean code》中编写代码中比较通用的代码编写原则,遵循这些原则能够大大增加我们代码的可读性,有助于代码后期维护和交接。 欢迎大家来我的个人博客玩耍~ https://xuchang-x.github.io/ 整洁代码的意义 随着脏代码增加,团队生产力持续下降趋向于零。当生产力下降时,管理层就只有增加更多忍受到项目中,期望提升生产力。可是新人并不熟悉系统的设计,搞不清楚什么样的修改符合设计意图,什么样的修改违背设计意图。于是他们制造更多的混乱,生产力向零的那端不断下降。 命名原则 核心原则:采用

weixin_37587973的博客 675

代码的坏味道——精准命名

前言:写好高质量的代码就应该从小事做起。一个好的变量名更应该从语义知道这个变量是在干什么事情。命名:这是我们定义变量、方法必不可少做的一件事情,可是你真的去用行动对每一个变量做到精准命名了吗?嗯没错,确实没有,如果想把这个事情做好,其实是非常耗时间和经历的。但是如果前期去用心定义一个变量,是比你之后(重构/迭代)代码省很多的时间。

^_^ 522

Java代码的整洁之道——手记

一、命名方式 类名首字母应该大写,方法名首字母小写,采用驼峰命名法。字符串常量,则采用全大写的方式,单词之间采用下划线“_”连接。 注:Java包package名则例外,全部采用小写,即使采用了单词组合,单词连接处也是小写。 例如: 类名:TestService 方法名:getStudentById 常量名:STUDENT_NAME 二、对象与类的设计 1、创建功能类或bean对象时,...

Mr_Fei的博客 424

代码风格规范

《移山之道——VSTS软件开发指南(第2版)》第10.1节 代码风格规范 10.1 代码风格规范 代码风格的原则是:简明,易读,无二义性。 提示:这是移山公司的一家之言,如果碰到争执,关键是要本着“保持简明,让代码更容易读”的原则,看看如下争执中的代码规范是否能够让程序员们更好地理解和维护程序。 10.1.1 缩进 是用Tab键好,还是2、4、8个空格? 结论:4个...

weixin_30267697的博客 204

代码整洁之道————学习笔记(待更新)

一、命名规范 变量,方法,类的名称尽量见名知意。 避免误导性的命名。 如0与O,I与1… 区分变量名时避免做无用区分。 如:假如有一个Protect类,还有一个ProtectInfo类和一个ProtectData类,那么这就是无意义命名,Info与Data意义并无区别。 使用读的出来的名字。 使用在全文中容易搜索的名字, 不要使用编码。 类名和对象名应该是名词或者名词短语。 如用户类UserList, 方法名应该是动词或者动词短语。 如有一个查询全部用户的函数:queryAllUserName() 二、

m0_53253682的博客 464

『研发小作坊的正规之路系列』之软件开发规范之道——序

再好的语言特性和蹩脚的花俏技巧,都远不如严格的软件开发规范来的有效。 为什么想起来写些关于软件开发规范的内容呢。由于这些年所在的公司规模比较小,平时软件开发的过程中很少注重一些方法论,这样那样的开发规范往往都被迫切的市场需求打的支离破碎。并且团队里面都是些年轻人,经验都不丰富,一般都只关注近期的交付物,是否能及时的完成任务,比较少关注后续的延续性。那为什么要在这个时候提起软件规范方面的东西呢?随着公司的发展,产品数量的 增加,维护的工作也在成指数级别的增加,新产品的开发总是从头再来,不关注任何的复用,导致每

技术爬虫(tech-reptile) 682

代码整洁之道——高质量代码命名

记得曾经看过一篇报道说:"程序员最难攻克的关卡是:如何命名(例如:给变量,类,函数和过程命名等等"。对,你没看错,这个结果是Quora 问答网站和更早的 Ubuntu 论坛跟帖的 4500 个开发者的投票。 只要你干过几年编程,就有可能曾经被某人糟糕的代码绊倒过,或者曾经也绊倒过他人,因为压根看不懂别人代码写的是啥,各种命名都看不懂,而且有些公司的代码还不让写注释。我...

欢迎来到小七的博客,这里将带你深入探索5G通信的神秘世界。无论你是通信领域的专业人士还是对这一领域充满好奇心的技术爱好者,这里都有专业协议解读、通信知识普及以及有趣的Python编程内容等你发现。 939

代码整洁之道——注释

注释: 1. 如果想在右括号的后面增加注释,那么你要做的是缩短代码(昨天刚经历过) 2. 位置标记不要滥用,否则就会陷入背景噪声之中。 ////////function/////////////////// //去掉多余无用的斜杠 3. 源代码控制系统是代码归属与名命的最好归属地。比如Git。 4. 能用函数或是变量表示意思就不要用注释,用变量更好的表示自己的意思。 if(smodule.getDependSubsystems().contains(subSysMod.getSubSyste

m0_37544464的博客 255

代码简洁之道——注释

(1)注释不能美化糟糕的代码:与其花时间编写jianshi

yezihumengjuan的专栏 584
上一篇: 面试前如何准备才能提高成功率(含免费面试资源)
下一篇: Java 面试重难点知识点总结//Java+Java面试+Java面试经验分享+自主学习+经验分享+资源分享
普通网友
博客等级 码龄5年 1265粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值