Java奇技淫巧:new对象后加大括号{},最后顺便做了个小框架?

简介: Java奇技淫巧:new对象后加大括号{},最后顺便做了个小框架?

这个技术很少有教程来讲,但是在源码中经常出现,所以我感觉有必要单独拿出来说一说。


步骤 1  new一个匿名子类对象    


我姑且叫这种情况为“匿名子类”吧,就是有这样的情况,你new一个类的时候直接加一对花括号,实际上已经创建了它的一个匿名子类。老实说,我第一次见到这种写法也是懵逼的。


比如我有一个类


public class Fu {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void eat(){
        System.out.println(name + " 吃饭!");
    }
}


这是一个平平无奇的类,假如我们要弄个类继承Fu,然后重写eat方法,一般会这么写:


public class Zi extends Fu{
    @Override
    public void eat() {
        System.out.println("这是Zi类的eat方法!");
    }
}


这样做当然是可以的,但是会有这样的情况,就是我们希望有个类,仅仅重写了eat方法,而且很确定不会在别的地方再使用该子类了,就可以new一个匿名子类对象:


Fu f = new Fu(){
    @Override
    public void eat() {
        System.out.println("eat方法被重写了!");
    }
};


这样就可以省去多写一个类的麻烦。


步骤 2  匿名子类的构造器

 

先看一段代码


public static void main(String[] args) {
    Fu f = new Fu(){
        /** 这里再打一个打括号,就是在匿名子类的构造器中写东西 */
        {
            setName("Zi");
        }
        @Override
        public void eat() {
            /** this.getClass为匿名类*/
            System.out.println(this.getClass());
            System.out.println(this.getName() + " eating...");
        }
    };
    f.eat();
}


这种写法也很奇特,但是真的有用!你可以在生成匿名子类对象的时候,把数据初始化一下。


步骤 3  实战应用1.给HashMap赋初值    


Map<String,Object> study = new HashMap<String,Object>(){{
    put("name","java小白翻身");
    put("url","java18.cn");
}};
System.out.println(study);


这下是真的学到了,因为生成的对象还是Map(因为多态),所以不会有任何影响,赶紧拿去秀翻同事吧~~


步骤 4  实战应用2.给ArrayList赋初值    


List<Integer> list = new ArrayList<Integer>(){{
    add(1);
    add(2);
    add(3);
}};
System.out.println(list);


步骤 5  实战应用3.传参的时候直接new接口    


这种情况是非常普遍的!

这种情况是非常普遍的!

这种情况是非常普遍的!

重要的话说三遍,如果你喜欢翻看源码,这种技巧真的是随处可见。比如:


//直接开启一个线程
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("线程开启!");
    }
}).start();


一般这种情况都是直接new接口,实际上是new一个接口的匿名实现类啦,不过我一般喜欢说new一个接口。

如果这个接口中只有一个抽象方法,就可以用lamda表达式:


new Thread(() -> {
    System.out.println("线程开启!");
}).start();


步骤 6  神级展开: 我顺手做了个小框架?!  

 

这部分内容是我突然想到的,既然这个匿名子类对象这么好用,我是不是可以用这个特性来做个SQL生成器?

最终做出来的效果是这样的:


String sql = new SQL(){{
   select("*").from("t_user").where("uname like 'j%'")
           .and("sex='男'").orderby("id desc");
}}.toString();
System.out.println(sql);


很美观,很有趣是不是,其实SQL类的代码异常简单啦,相信你也一定可以写出来:


package com.javaxbfs.demo;
/** 自定义简单SQL构建器,不支持复杂sql* */
public class SQL {
    public StringBuffer sql = new StringBuffer();
    public SQL select (String targetStr){
        sql.append(" select ").append(targetStr);
        return this;
    }
    public SQL from (String table){
        sql.append(" from ").append(table);
        return this;
    }
    public SQL where (String where){
        sql.append(" where ").append(where);
        return this;
    }
    public SQL and (String and){
        sql.append(" and ").append(and);
        return this;
    }
    public SQL orderby (String orderby){
        sql.append(" order by ").append(orderby);
        return this;
    }
    public String toString() {
      return sql.toString();
    }
}
相关文章
|
24天前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
24天前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
1月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
129 3
|
19天前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
30 4
|
1月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
1月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
1月前
|
消息中间件 Java 数据库连接
Java 反射最全详解 ,框架设计必掌握!
本文详细解析Java反射机制,包括反射的概念、用途、实现原理及应用场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Java 反射最全详解 ,框架设计必掌握!
|
29天前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
40 2
|
1月前
|
前端开发 Java 数据库连接
你不可不知道的JAVA EE 框架有哪些?
本文介绍了框架的基本概念及其在编程领域的应用,强调了软件框架作为通用、可复用的软件环境的重要性。文章分析了早期Java EE开发中使用JSP+Servlet技术的弊端,包括可维护性差和代码重用性低等问题,并阐述了使用框架的优势,如提高开发效率、增强代码规范性和可维护性及提升软件性能。最后,文中详细描述了几种主流的Java EE框架,包括Spring、Spring MVC、MyBatis、Hibernate和Struts 2,这些框架通过提供强大的功能和支持,显著提升了Java EE应用的开发效率和稳定性。
55 1
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
50 17