今天开始介绍项目中的一些奇淫技巧,帮助安卓开发者更快更方便的开发!
1.骚年技巧一之Lombok
Lombok简介
Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。
官方地址:https://projectlombok.org/
github地址:https://github.com/rzwitserloot/lombok。
如何使用到项目中:
在官方文档中说明很清楚,首先在Plugins下载一个 Lombok Plugin
https://projectlombok.org/setup/android.html
Go to File > Settings > Plugins
Click on Browse repositories…
Search for Lombok Plugin
Click on Install plugin
Restart Android Studio
然后在
build.gradle
添加依赖
provided “org.projectlombok:lombok:1.12.6”
下面我们就可以开始使用Lombok了!
学习mark:
Lombok提供了以下注解
- val:
用在局部变量前面,相当于将变量声明为final - @NonNull:
给方法参数增加这个注解会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出NPE(NullPointerException) - @Cleanup:
自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出之前会自动清理资源,自动生成try-finally这样的代码来关闭流 - @Getter/@Setter:
用在属性上,再也不用自己手写setter和getter方法了,还可以指定访问范围 @ToString:
用在类上,可以自动覆写toString方法,当然还可以加其他参数,
例如 @ToString(exclude =”id”)排除id属性,
或者 @ToString(callSuper = true, includeFieldNames = true)调用父类的toString方法,包含所有属性@EqualsAndHashCode:用在类上,自动生成equals方法和hashCode方法
- @NoArgsConstructor,
@RequiredArgsConstructor
and@AllArgsConstructor:
用在类上,自动生成无参构造和使用所有参数的构造函数以及把所有@NonNull属性作为参数的构造函数,如果指定staticName = “of”参数,同时还会生成一个返回类对象的静态工厂方法,比使用构造函数方便很多 - @Data:
注解在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和NoArgsConstructor - @Value:
用在类上,是@Data的不可变形式,相当于为属性添加final声明,只提供getter方法,而不提供setter方法 - @Builder:用在类、构造器、方法上,
为你提供复杂的builder APIs,让你可以像如下方式一样调用
Person.builder(). name("Adam Savage").city("San Francisco"). job("Mythbusters").job("Unchained Reaction").build();
更多说明参考Builder
- @SneakyThrows:
自动抛受检异常,而无需显式在方法上使用throws语句 - @Synchronized:
用在方法上,将方法声明为同步的,并自动加锁,而锁对象是一个私有的属性 lock或 LOCK,而java中的synchronized关键字锁对象是this,锁在this或者自己的类对象上存在副作用,就是你不能阻止非受控代码去锁this或者类对象,这可能会导致竞争条件或者其它线程错误 - @Getter(lazy = true):
可以替代经典的Double Check
Lock样板代码 - @Log:
根据不同的注解生成不同类型的log对象
下面来实战一番:
get技能:
每个类下的所有方法我们可以在Android studio中的Structure中看到
首先是@Data注解
然后是@Value注解
@Value需要和@NonNull一起使用 不是会报错 因为Get方法可能获取为Null值
截图太多了!我就不给大家一一示范了!更多的大家自己去探索吧
- val示例
public static void main(String[] args) {
val lists = new ArrayList<String>();
//=>相当于
- 列表内容
final List<String> lists2 = new ArrayList<>();
}
- @NonNull示例
public void notNullExample(@NonNull String string) {
string.length();
}
//=>相当于
public void notNullExample(String string) {
if (string != null) {
string.length();
} else {
throw new NullPointerException("null");
}
}
- @Cleanup示例
public static void main(String[] args) {
try {
@Cleanup InputStream inputStream = new FileInputStream(args[0]);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//=>相当于
InputStream inputStream = null;
try {
inputStream = new FileInputStream(args[0]);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- @Builder示例
@Builder
public class BuilderExample {
private String name;
private int age;
@Singular
private Set<String> occupations;
public static void main(String[] args) {
BuilderExample test = BuilderExample.builder().age(11).name("test").build();
}
}
差不多就是这些了,详细的请移步官网,很So easy!
2.骚年技巧二之Java 8 lambda表达式
- 事件
//=>使用前
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TAG","事件的匿名内部类");
}
});
//=>使用后
button.setOnClickListener(view-> Log.d(TAG,"按钮被点击,lambda表达式"));
- 循环
//=>使用前
for (Goods goods: GoodsList) {
Log.i("tag",goods.getName());
}
//=>使用后
// 使用 lambda 表达式以及函数操作(functional operation)
GoodsList.forEach((Goods ) -> Log.i("tag",goods.getName()); "));
- 开启线程
//=>使用前
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Before Java8, too much code for too little to do");
}
}).start();
//=>使用后
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
当然不止这点!详情请百度Java8 lambda表达式10个示例
3.骚年技巧三之Instant run
在Android Studio2.0的推出逆天功能Instant Run
使用 instant run,在第一次运行之后,不用重新build就能在UI可以直接显示修改效果!当然现在只能在真机上,但是它不仅能够在UI可以直接显示效果,还能刷新修改代码逻辑,样式。。。。不用再苦苦等build了,节约生命呀!
下面我们开始使用 instant run吧!
- 首先要升级到Android Studio 2.0
- 升级android tools build
instant run功能之后再android tools build 的2.0.0的版本才可以使用。
需要在build.gradle中指定
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0-alpha1'
}
}
- 设置instant Run
当然升级到2.0以上它是自动开启的,当我们的工具栏上多出一个闪电图标,你就开始拥有了闪电般的调试速度了!
当然更多的详情还是自己百度吧!