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();
    }
}
相关文章
|
5月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
499 0
|
5月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
5月前
|
存储 安全 Java
《数据之美》:Java集合框架全景解析
Java集合框架是数据管理的核心工具,涵盖List、Set、Map等体系,提供丰富接口与实现类,支持高效的数据操作与算法处理。
|
5月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
350 8
|
5月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
158 7
|
6月前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
2468 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
6月前
|
SQL Java 数据库连接
区分iBatis与MyBatis:两个Java数据库框架的比较
总结起来:虽然从技术角度看,iBATIS已经停止更新但仍然可用;然而考虑到长期项目健康度及未来可能需求变化情况下MYBATISS无疑会是一个更佳选择因其具备良好生命周期管理机制同时也因为社区力量背书确保问题修复新特征添加速度快捷有效.
423 12
|
7月前
|
缓存 安全 Java
Java反射机制:动态操作类与对象
Java反射机制是运行时动态操作类与对象的强大工具,支持获取类信息、动态创建实例、调用方法、访问字段等。它在框架开发、依赖注入、动态代理等方面有广泛应用,但也存在性能开销和安全风险。本文详解反射核心API、实战案例及性能优化策略,助你掌握Java动态编程精髓。
|
7月前
|
存储 缓存 安全
Java集合框架(三):Map体系与ConcurrentHashMap
本文深入解析Java中Map接口体系及其实现类,包括HashMap、ConcurrentHashMap等的工作原理与线程安全机制。内容涵盖哈希冲突解决、扩容策略、并发优化,以及不同Map实现的适用场景,助你掌握高并发编程核心技巧。
|
7月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
546 23