lombok系列3:lombok的实验类特性

lombok除了已经推荐使用的基本功能,还维护了一个创新型的注解,有些功能有违常规对java认知,或者只支持eclipse,其他IDE支持有问题,甚至某些环境完全不可用。因此没有正式使用。

但是的确很有创意,这些注解已经在jar中提供,只不过它是归在”lombok.experimental.” 包中;而基本功能在”lombok.” 包中。

@Accessors

定制流畅的访问器。

@Accessors(chain=true)

链式访问,该注解设置chain=true,生成setter方法返回this,代替了默认的返回void。

package com.pollyduan;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain=true)
public class User {
    private Integer id;
    private String name;
    private Integer age;

    public static void main(String[] args) {
        User user=new User().setAge(31).setName("pollyduan");
        System.out.println(user);
    }

}

@Accessors(fluent = true)

chain=true类似,区别在于getter和setter不带set和get前缀。

package com.pollyduan;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(fluent=true)
public class User {
    private Integer id;
    private String name;
    private Integer age;

    public static void main(String[] args) {
        User user=new User().age(31).name("pollyduan");
        System.out.println(user);
    }

}

@Accessors(prefix = “f”)

没什么意思,直接看代码。

package com.pollyduan;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(prefix = "f")
public class User {
    private String fName = "Hello, World!";

    public static void main(String[] args) {
        User user=new User();
        user.setName("pollyduan");//注意方法名
        System.out.println(user);
    }

}

@ExtensionMethod

为已经存在的类增加方法。

它可以达到扩展已有类的方法。它之所以作为实验特性,是因为:

在代码风格上冲击较大;
它只是在编码时看起来扩展了普通类的方法,但lombok目前还没有好的办法让运行时其他类引用;
elipse可用,netbeans完全没用;
合法性待考证。

来个例子吧。我们知道我们要对java.util.Date对象进行格式化,通常使用SimpleDateFormat对象来实现,我们能不能给Date对象增加一个format方法呢?come on…

工具类:

package com.pollyduan;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Extensions {
    public static String format(Date date){
        SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return df.format(date);
    }
}

应用类:

package com.pollyduan;

import java.text.SimpleDateFormat;
import java.util.Date;

import lombok.Data;
import lombok.experimental.ExtensionMethod;

@Data
@ExtensionMethod({java.util.Arrays.class, Extensions.class,SimpleDateFormat.class})
public class ExtensionMethodDemo {
    private void test() {
        Date date=new Date();
        String d=date.format();
        System.out.println(d);
    }
    public static void main(String[] args) {
        new ExtensionMethodDemo().test();
    }

}

实现依据:

假设被扩展类为A,扩展工具类为B,那么就需要在类B中定义个static的方法,该方法有一个参数,类型为A。

然后,在A中添加@ExtensionMethod(B.class) 注解即可。

一个泛型的例子:

//工具方法
public static <T> T or(T obj, T ifNull) {
   return obj != null ? obj : ifNull;
}

//使用
String str=null;
System.out.pritnln(str.or("default_value"));//default_value
str="abcd";
System.out.pritnln(str.or("default_value"));//abcd

@FieldDefaults

设置缺省的字段修饰符。

非常乱,看不下去了,上代码。

package com.pollyduan;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.experimental.FieldDefaults;
import lombok.experimental.NonFinal;
import lombok.experimental.PackagePrivate;

@AllArgsConstructor
@FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE)
public class FieldDefaultsExample {
    public final int a;
    int b;
    @NonFinal int c;
    @PackagePrivate int d;
}

缺省为private final

如果不想使用缺省值,可显式标注,或使用NonFinal取消final。

以上类,相当于:

package com.pollyduan;

public class FieldDefaultsExample {
    public final int a;//明确定义的,不受影响
    private final int b;//未明确定义的,使用注解的private final
    private int c;//指定了NonFinal则只保留private
    final int d;//执行了PackagePrivate,表示使用包私有,即default可见修饰符,只保留final

    public FieldDefaultsExample(int a, int b, int c, int d) {
        super();
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
    }
}

@Delegate

代理方法。

package com.pollyduan;

import java.util.ArrayList;
import java.util.Collection;

import lombok.experimental.Delegate;

public class User {

    private interface SimpleCollection {
        boolean add(String item);
        boolean remove(Object item);
    }

    @Delegate(types = SimpleCollection.class)
    private final Collection<String> collection = new ArrayList<String>();

    public static void main(String[] args) {
         User user=new User();
         user.add("item1");//实际上加到collection中去了
    }

}

@Wither

package com.pollyduan;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.Wither;

@AllArgsConstructor
@ToString
public class User {
    @Wither
    private Integer id;
    @NonNull
    @Wither(AccessLevel.PROTECTED)
    private String name;

    public static void main(String[] args) {
         User user=new User(1001,"pollyduan")
                 .withId(123)
                 .withName("tom");
         System.out.println(user);
    }

}

执行输出:User(id=123, name=tom)

没明白这种模式有啥用,必须全参构造,然后通过with改。。。。

@OnX

乱呀,等脑子清醒再说吧。

@UtilityClass

工具类。

自动将所有域对象修改为static;而且自动创建一个私有的构造器:

private UtilityClassExample() {
 throw new java.lang.UnsupportedOperationException("This is a utility class and cannot be instantiated");
}

@Helper

不知所谓。

package com.pollyduan;

import lombok.experimental.Helper;

public class HelperExample {
    int someMethod(int arg1) {
        int localVar = 5;

        @Helper
        class Helpers {
            int helperMethod(int arg) {
                return arg + localVar;
            }
        }

        return helperMethod(10);
    }
}

相当于:

package com.pollyduan;

public class HelperExample {
    int someMethod(int arg1) {
        int localVar = 5;

        class Helpers {
            int helperMethod(int arg) {
                return arg + localVar;
            }
        }

        return new Helpers().helperMethod(10);//就这点区别,毛用?
    }
}

小结

想法很好,也许哪一天可被接纳,或者被借鉴。

总结起来,有几个个人比较关注,比如:@Delegate 、@ExtensionMethod、@Accessors;在某些环境下,可尝试使用。

时间: 2025-01-25 12:17:57

lombok系列3:lombok的实验类特性的相关文章

lombok系列2:lombok注解详解

开篇 看到第一篇<初识lombok>你可能意犹未尽,本文我们按照场景来介绍一下常用的注解. 未特别说明,均标注在类级别. lombok.Data 最常用的注解,编译时自动添加Setter.Getter.toString().equals()和hashCode(). package com.pollyduan; import java.util.Date; import lombok.Data; @Data public class User { private Integer id; priv

lombok系列1:初识lombok

初识lombok 官网:https://projectlombok.org/ 什么是lombok 连官网都懒得废话,只给出了一句广告词:给你的java加点料(spice up your java). 我们自己来总结一下: lombok是一个ide插件,它可以让我们写更少的代码,而编译出更多的字节码. 也就是说,我们可以让我们编译出一个复杂的.class文件,而我们的.java文件很干净清爽. 为什么要使用lombok 首先,我们可以写更少的代码,而不影响其他类引用,方法一个不能少: 其次,lom

Kotlin和Java EE系列之—— 如何让Kotlin类对Java EE友好

Kotlin 和 Java 都是 JVM 语言,所以它们之间相互转换很容易,是这样吗?不完全是,让 Kotlin 的类对 JEE 友好还需要一点工作. Kotlin 的主要优势之一就是能很好地集成 Java.事实上 Java 很容易转换为 Kotlin,看起来用 Kotlin 写 Java EE 应用似乎不需要动什么脑筋.然而,两者之间存在一些微妙的差别,使得转换并不那么顺畅: 大多数框架要求非 final 的类,而 Kotlin 的类是 final 的. 注入会引入大量不必要的空检查. 上述两

上海查禁六个系列含违禁成分减肥类食品

新华社6月9日消息 记者9日从上海市食药监局获悉,上海将在全市范围内查禁名称标示为"博美堂左旋肉碱减肥胶囊"等六个系列.22个批次的声称减肥类食品,这些产品被检出含有西布曲明.酚酞等违禁成分. 据介绍,标示生产企业为"博美(香港)集团有限公司.赤峰御鹿生物技术有限公司"生产8个不同批次的"博美堂左旋肉碱减肥胶囊",标示生产企业为"广州冠健生物科技有限公司"生产6个不同批次的蝶之舞牌减肥胶囊(纤诗婷左旋肉碱)等六个系列产品,均被

C#类特性和属性特性

using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Reflection; namespace ConsoleApplication6 { /// <summary> /// AttributeTargets.Class可以对类应用属性 /// Inherited能否由派生类或重写成员继承 /// AllowMu

[ASP.NET开发系列] 购物推车程序设计——购物车类

asp.net|程序|购物车|设计 Web应用程序开发中,大多数的电子商务网站都有网上购物这一功能模块,所以购物车程序的编写就显得非常重要. 购物车的作用不外就是实现这些功能:添加物件.修改物件.删除物件.检查推车.查看推车等.在本文就讲解"添加物件"."删除物件"和"查看推车"这三个功能.当然,这里只不过是一个简单的购物车类,完成的功能也不多,还不够完善,需要大家在这个基础做扩展使它的功能更加完善. C#是一种完全的OOP(Object Ori

C#线程系列讲座(2):Thread类的应用

一.Thread类的基本用法 通过System.Threading.Thread类可以开始新 的线程,并在线程堆栈中运行静态或实例方法.可以通过Thread类的的构造方法 传递一个无参数,并且不返回值(返回void)的委托(ThreadStart),这个委托的 定义如下: [ComVisibleAttribute(true)] public delegate void ThreadStart() 我们可以通过如下的方法来建立并运行一个 线程. using System;using System.

Android快速开发系列 10个常用工具类

目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311,本文出自[张鸿洋的博客] 打开大家手上的项目,基本都会有一大批的辅助类,今天特此整理出10个基本每个项目中都会使用的工具类,用于快速开发~~ 在此感谢群里给我发项目中工具类的兄弟/姐妹~ 1.日志工具类L.java [java] view plaincopy package com.zhy.utils;      import android.u

《Java &amp;amp; Ruby 代码分析系列》之基本的类实例对比

本例以Box类为例,比较两种语言基本的类实例区别 Java: package practice; public class Box { public int length; private int height; protected int width; public Box(int length, int width, int height){ this.length = length; this.width = width; this.height = height; } public vo