首页 > 编程语言 >java基础(小技巧)

java基础(小技巧)

时间:2024-09-16 22:48:41浏览次数:3  
标签:java 技巧 age 基础 生成 String 注解 public name

文章目录


提示:以下是本篇文章正文内容,下面案例可供参考

一、日志输出

之前使用的方式。在要使用的类里面定义日志类:

private static Logger logger = LoggerFactory.getLogger(“xxx”);

现在使用方式:

### pom.xml配置文件引入依赖
  <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
            <scope>provided</scope>
  </dependency>

使用方式:
在要使用的类上添加注解@Slf4j

想输出日志,直接使用log.infolog.error 即可,不在需要定义日志类(和之前使用日志输出一样)。示例代码如下。

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class T1 {
    public static void main(String[] args) {
        MyObject obj = new MyObject("example", 42);
        String jsonString = JSONObject.toJSONString(obj);//将对象转为jsonObject
        System.out.println(jsonString);
        log.info("输出日志信息:"+jsonString);
        log.error("输出日志信息:"+jsonString);
    }

    static class MyObject {
        private String name;
        private int value;
        
        public MyObject(String name, int value) {
            this.name = name;
            this.value = value;
        }

        // Getters and setters
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }
    }
}

二、字符串拼接

使用方式:String.format("%s|%s|%s", s1, s2, s3).以|作为连接

        Object s1="A1";
        Object s2="B2";
        Object s3="C3";
        String stringDeal = String.format("%s|%s|%s", s1, s2, s3);
        System.out.println("据输出:"+stringDeal);
        据输出:A1|B2|C3

三、日期比较

isAfter 和 isBefore 是 java.util.Date 类中的两个方法,用于比较两个日期对象。

  • isAfter(Date when):
    isAfter 方法用于检查调用该方法的日期对象是否在指定日期参数 when 之后。如果调用对象的日期晚于参数日期,则返回 true;否则返回 false。

  • isBefore(Date when):
    isBefore 方法用于检查调用该方法的日期对象是否在指定日期参数 when 之前。如果调用对象的日期早于参数日期,则返回 true;否则返回 false。

import java.util.Date;

public class DateComparison {
    public static void main(String[] args) {
        Date now = new Date(); // 当前日期和时间
        Date tomorrow = new Date(now.getTime() + 86400000); // 假设明天的日期

        // 检查现在是否在明天之后
        System.out.println("Is now after tomorrow? " + now.isAfter(tomorrow));

        // 检查现在是否在明天之前
        System.out.println("Is now before tomorrow? " + now.isBefore(tomorrow));

        // 检查明天是否在现在之后
        System.out.println("Is tomorrow after now? " + tomorrow.isAfter(now));

        // 检查明天是否在现在之前
        System.out.println("Is tomorrow before now? " + tomorrow.isBefore(now));
    }
}

输出:
Is now after tomorrow? false
Is now before tomorrow? true
Is tomorrow after now? true
Is tomorrow before now? false

四、常用注解

@Data注解是一个综合性的注解,它可以为类生成所有常用的方法,包括getter和setter、equals和hashCode、toString、构造器等等。例如:

注解功能
@Getter为属性生成getter方法
@Setter为属性生成setter方法
@NoArgsConstructor为类生成无参构造器
@RequiredArgsConstructor为类生成包含所有final或@NonNull属性作为参数的构造器
@AllArgsConstructor为类生成包含所有属性作为参数的构造器
@Data为类生成所有常用的方法,包括getter和setter、equals和hashCode、toString、构造器等等
@Builder为类生成一个构建器(builder)模式,让你可以用链式调用的方式创建对象
@Slf4j为这个类生成一个名为log的日志变量,使用org.slf4j.Logger作为日志框架。让可以方便地打印日志信息
@SneakyThrows让你在方法中抛出受检异常(checked exception),而不需要在方法签名中声明或者使用try-catch语句
@Value为类生成一个不可变(immutable)的对象,即所有属性都是final的,并且只有getter方法,没有setter方法
@Accessor为属性生成自定义的访问方法,让你可以控制方法的名称、修饰符、参数等等
@With为属性生成一个返回一个新对象的方法,让你可以用不可变(immutable)的方式修改对象的属性
@Singular为集合属性生成一个构建器(builder)模式,让你可以用链式调用的方式添加元素
@NonNull为方法或构造器的参数添加非空检查,如果参数为null,抛出NullPointerException
@Cleanup为需要关闭的资源自动调用close方法,避免资源泄漏
@Synchronized为方法添加同步锁,避免多线程问题
@EqualsAndHashCode为类生成equals和hashCode方法,根据属性的值判断对象是否相等
@ToString为类生成toString方法,返回对象的字符串表示
@Delegate为类生成委托(delegate)方法,让你可以调用另一个对象的方法,而不需要自己编写
@Val表示一个不可变的局部变量,相当于使用final修饰符
@Var表示一个可变的局部变量,相当于省略了类型声明

举几个常用例子:

  • @Data 常用

@Data注解是一个综合性的注解,它可以为类生成所有常用的方法,包括getter和setter、equals和hashCode、toString、构造器等等。例如:

import lombok.Data;

@Data
public class User {
    private String name;
    private int age;
}

这段代码相当于:

public class User {
    private String name;
    private int age;

    public User() {
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return age == user.age && Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

可以看到,使用@Data注解可以大大减少你的代码量,让你的类更简洁和清晰。当然,如果你不想生成所有的方法,你也可以使用其他的注解来选择性地生成你需要的方法。

五、Lombok的原理

Lombok利用了Java的注解处理器(Annotation Processor)机制,它可以在编译时扫描和处理注解,并生成额外的Java代码。Lombok通过实现一个自定义的注解处理器,来拦截和修改抽象语法树(AST),从而在类中添加相应的方法,字段,构造器等。Lombok还提供了一个插件,可以让IDE在编辑时也能识别和显示Lombok生成的代码,从而避免编译错误和提示信息的不一致。

Lombok的原理可以用以下几个步骤来概括:

  • 定义一个注解,比如@Getter,用来标记需要生成getter方法的类或字段。
  • 定义一个注解处理器,比如GetterProcessor,用来处理@Getter注解,并在类中生成相应的getter方法。
  • 在注解处理器中,使用Lombok提供的API,比如JavacAST,JavacHandlerUtil等,来获取和修改AST。
  • 在编译时,使用javac或者其他工具(比如maven,gradle等)来调用注解处理器,并传入源代码。
  • 注解处理器扫描源代码中的注解,并根据注解的参数和目标来生成相应的代码,并添加到AST中。
  • 编译器根据修改后的AST来生成字节码文件(.class文件)。

参考:参考Lombok

  • 总结: Lombok是一个非常实用的Java库,它可以让我们的代码更加简洁,可读,健壮。Lombok有很多优点,但也有一些缺点,比如可能会影响代码的调试,测试,维护等。因此,在使用Lombok时,我们需要权衡利弊,根据自己的需求和喜好来选择合适的注解和配置。

标签:java,技巧,age,基础,生成,String,注解,public,name
From: https://blog.csdn.net/qq_27627985/article/details/142303121

相关文章

  • SpreadJS 17.1.5 -JavaScript 电子表格组件
    SpreadJS JavaScript电子表格组件示例全球最畅销的JavaScript电子表格,包含500多个Excel函数快速提供真正类似Excel的电子表格体验-完全不依赖Excel。创建财务应用程序,仪表板,图表,数据透视表,性能基准,科学实验室笔记本以及其他类似的JavaScript电子表格应用程序......
  • 软件测试工程师面试整理-面试技巧
    在面试中,除了扎实的知识和经验外,良好的面试技巧也是成功的重要因素。这些技巧可以帮助你更好地展示自己,让面试官对你留下深刻的印象。以下是一些实用的面试技巧:1.做好准备● 研究公司和职位:在面试前,深入了解公司的业务、文化和你申请的职位要求。了解公司最近的新闻、项......
  • Java 值传递与引用传递
    以下是包含引用的完整博客文章,以markdown格式输出,附带“Java只有值传递”的相关参考来源。Java是一种广泛使用的面向对象编程语言,但对于值传递(passbyvalue)和引用传递(passbyreference)的理解,很多开发者往往会混淆。在这篇文章中,我将详细解释Java的传递机制,并引入对......
  • JAVA-IO 指定目录中查找文件,文件合并分割
    指定目录中查找文件publicstaticList<String>findFile(Filetarget,StringfileName){ArrayList<String>path=newArrayList<>();if(target==null){returnpath;}if(target.isDirectory()){File[]files=target.li......
  • JAVA-IO获取resource WEB-INF 中文件 JAR包中
    getResource+getPath()classPaththis.getClass().getClassLoader().getResource(StringUtils.EMPTY).getPath()Stringpath=this.getClass().getClassLoader().getResource(fileName).getPath();StringfilePath=URLDecoder.decode(path,StandardCharsets.UTF_8);......
  • [Java面向对象]封装继承多态
    封装、继承和多态是面向对象编程的三大特征。封装封装概念封装就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法)才能对数据进行操作。封装的好处隐藏实现的细节一个操作具体的实现过程往往很复杂,通过封装用户......
  • 软件设计原则(Java实现/给出正例反例)
    文章目录前言1.开闭原则(Open/ClosedPrinciple)违反开闭原则的示例遵循开闭原则的示例2.里氏代换原则(LiskovSubstitutionPrinciple)违反里氏代换原则的示例遵循里氏代换原则的示例3.依赖倒转原则(DependencyInversionPrinciple)违反依赖倒转原则的示例遵循依赖倒转......
  • 铁路订票平台小程序的设计与实现(Java+Mysql+万字文档+ppt+系统源码+数据库 +调试)
    目  录目  录第1章 绪论1.1 课题背景1.2课题意义1.3研究内容第2章 开发环境与技术2.1MYSQL数据库2.2Java语言2.3微信小程序技术2.4 SpringBoot框架2.5 B/S架构2.6 Tomcat介绍2.7HTML简介2.8MyEclipse开发工具第3章 系统分析......
  • Java - 1
    特点面向对象OOP健壮性:强类型机制、异常处理、垃圾的自动收集跨平台性:.class文件可以在多个系统下运行(java虚拟机-JVM)解释性语言:编译好的代码需要解释器来执行JVM-JavavirtualmachineJDK包含JVM​ -运行->JVMforLinux​ ......
  • 基于微信小程序的使命召唤游戏助手的设计与实现(Java+Mysql+万字文档+ppt+系统源码+数
    目 录1绪  论1.1开发背景1.2国内外研究现状和发展趋势综述1.3开发设计的意义及研究方向2系统开发技术2.1JAVA编程语言2.2springboot框架2.3IDEA介绍2.4B/S架构2.5MySQL数据库介绍2.6微服务架构2.7微服务架构的优势3系统分析3.1整体分析......