Android特定语言 Xtendroid
Xtendroid是一款Android的领域特定语言,它大大降低样板代码,同时提供巨大的工具支持。Xtendroid利用Xtend transpiler实现,它的特点是能够在Java代码编辑或编译期间具有拓展方法和活动注释(实时编辑代码生成器)功能。活动注释,他特别能够让Xtend比Kotlin或者Groovy语言更加适合DSL的创建。Xtendroid支持的Eclipse和IntelliJ/ Android Studio,其中包括代码完成,调试等。
举例特点
Anonymous inner classes (lambdas)
Android code:
// get button widget, set onclick handler to toast a message
Button myButton = (Button) findViewById(R.id.my_button);
myButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Toast.makeText(this, "Hello, world!", Toast.LENGTH_LONG).show();
}
});
Xtendroid code:
import static extension org.xtendroid.utils.AlertUtils.* // for toast(), etc.
// myButton references getMyButton(), a lazy-getter generated by @AndroidActivity
myButton.onClickListener = [View v| // Lambda - params are optional
toast("Hello, world!")
]
Note: Semi-colons optional, compact and differentiating lambda syntax, getters/setters as properties.
Type Inference
Android code:
// Store JSONObject results into an array of HashMaps
ArrayList<HashMap<String,JSONObject>> results = new ArrayList<HashMap<String,JSONObject>>();
HashMap<String,JsonObject> result1 = new HashMap<String,JSONObject>();
result1.put("result1", new JSONObject());
result2.put("result2", new JSONObject());
results.put(result1);
results.put(result2);
Xtendroid (Xtend) code:
var results = #[
#{ "result1" -> new JSONObject },
#{ "result2" -> new JSONObject }
]
Note: compact notation for Lists and Maps, method call brackets are optional
Multi-threading
Blink a button 3 times (equivalent Android code is too verbose to include here):
import static extension org.xtendroid.utils.AsyncBuilder.*
// Blink button 3 times using AsyncTask
async [
// this is the doInBackground() code, runs in the background
for (i : 1..3) { // number ranges, nice!
runOnUiThread [ myButton.pressed = true ]
Thread.sleep(250) // look ma! no try/catch!
runOnUiThread [ myButton.pressed = false ]
Thread.sleep(250)
}
return true
].then [result|
// This is the onPostExecute() code, runs on UI thread
if (result) {
toast("Done!")
}
].onError [error|
toast("Oops! " + error.message)
].start()
Note: sneaky throws, smoother error handling. See documentation for the many other benefits to using the AsyncBuilder.
Android boilerplate removal
Creating a Parcelable in Android:
public class Student implements Parcelable {
private String id;
private String name;
private String grade;
// Constructor
public Student(){
}
// Getter and setter methods
// ... ommitted for brevity!
// Parcelling part
public Student(Parcel in){
String[] data = new String[3];
in.readStringArray(data);
this.id = data[0];
this.name = data[1];
this.grade = data[2];
}
@Оverride
public int describeContents(){
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] {this.id,
this.name,
this.grade});
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public Student createFromParcel(Parcel in) {
return new Student(in);
}
public Student[] newArray(int size) {
return new Student[size];
}
};
}
Xtendroid:
// @Accessors creates getters/setters, @AndroidParcelable makes it parcelable!
@Accessors @AndroidParcelable class Student {
String id
String name
String grade
}
Note: the above Xtendroid code essentially generates the same Android code above, into the build/generated folder, which gets compiled normally. Full bi-directional interoperability with existing Java classes.
Functional programming
@Accessors class User {
String username
long salary
int age
}
var List<User> users = getAllUsers() // from somewhere...
var result = users.filter[ age >= 40 ].maxBy[ salary ]
toast('''Top over 40 is «result.username» earning «result.salary»'''
Note: String templating, many built-in list comprehension functions, lambdas taking a single object parameter implicitly puts in scope.
Builder pattern
// Sample Builder class to create UI widgets, like Kotlin's Anko
class UiBuilder {
def static LinearLayout linearLayout(Context it, (LinearLayout)=>void initializer) {
new LinearLayout(it) => initializer
}
def static Button button(Context it, (Button)=>void initializer) {
new Button(it) => initializer
}
}
// Now let's use it!
import static extension org.xtendroid.utils.AlertUtils.*
import static extension UiBuilder.*
contentView = linearLayout [
gravity = Gravity.CENTER
addView( button [
text = "Say Hello!"
onClickListener = [
toast("Hello Android from Xtendroid!")
]
])
]
Note: You can create your own project-specific DSL!
Utilities
import static extension org.xtendroid.utils.AlertUtils.*
import static extension org.xtendroid.utils.TimeUtils.*
var Date yesterday = 24.hours.ago
var Date tomorrow = 24.hours.fromNow
var Date futureDate = now + 48.days + 20.hours + 2.seconds
if (futureDate - now < 24.hours) {
confirm("Less than a day to go! Do it now?") [
// user wants to do it now
doIt()
]
}
Note: using all of the above makes writing unit tests and instrumentation tests very easy, and fun!
Android特定语言 Xtendroid的更多相关文章
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)
本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)
前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modeling SDK进行领域特定语言(DSL)的开发,包括两个部分的内容.在第一部分中,将对 ...
- Android 多语言
Android 多语言 在res文件上右击创建新的values文件 在strings文件中设置多语言 3.在layout文件中使用 @strings/key 引用相应资源
- [综述]领域特定语言(Domain-Specific Language)的概念和意义
领域特定语言(Domain Specific Language, DSL)是一种为解决特定领域问题而对某个特定领域操作和概念进行抽象的语言.领域特定语言只是针对某个特定的领域,这点与通用编程语言(Ge ...
- Android Init语言
Android Init语言是一种特别简单的语言,专门用来写Android的Init进程使用的配置文件的. 相当于Linux系统中的rc文件(这句话对于Linux者多半是句废话). Android I ...
- 正则表达式与领域特定语言(DSL)
如何设计一门语言(十)——正则表达式与领域特定语言(DSL) 几个月前就一直有博友关心DSL的问题,于是我想一想,我在gac.codeplex.com里面也创建了一些DSL,于是今天就来说一说这个事情 ...
- 在Visual Studio 2012中使用VMSDK开发领域特定语言1
在Visual Studio 2012中使用VMSDK开发领域特定语言(一) 前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modelin ...
- Android各国语言对照表(values-xxx)
eg: 阿拉伯 Arabic SA values-ar Android各国语言对照表https://blog.csdn.net/jiangguohu1/article/details/5044014 ...
- Android 多语言支持
本文内容 字符串本地化原理 环境 创建项目 测试其他语言 Android 本地化语言 ISO 编码 参考资料 使用 Android 的人越来越多,每天都在增加.因此,当你想把你的应用成功地全球化时,通 ...
随机推荐
- P4568 飞行路线【分层图最短路】
题目链接:https://www.luogu.org/problem/P4568 题目大意:给定n个点,m条无向边,k次机会经过边时代价为 0 .给出起点和终点,求其最短路径. 解题思路: 两种方法, ...
- Selenium问题集锦
此文章用于记录使用Selenium遇见的问题~ 问题1:sendkeys直接报错如下: 解决方案:selenium 驱动和Chrome浏览器的版本必须对应,不然会报此错.驱动地址:点此跳转 下载前先看 ...
- xmind常用快捷键
1-新建导图Ctrl+shift+N2-编辑文字空格键3-插入图片Ctrl+i4-插入主题Enter键5-插入主题之前Shift+Enter键6-插入子主题Tab键7-放大导图“Ctrl”+“+”,先 ...
- 【坑】springMvc 信息校验,读取不到错误配置信息的问题
文章目录 前言 ResourceBundleMessageSource 后记 前言 springMvc 的一大利器,validation 检验,通过注解,可以帮我们完成校验,很是顺手. 终极偷懒检验, ...
- WUSTOJ 1889: 编辑距离(Java)
转自:
- 十、LCD的framebuffer设备驱动
在读者学习本章以及后续LCD相关章节之前,最好拥有LCD裸机基础,可以参考:LCD编程. 在内核中,表示LCD使用的是framebuffer(帧缓冲,简写为fb),其内容对应于屏幕上的界面显示.修改f ...
- 2019杭电多校一 K. Function (数论)
大意: 给定$n(n\le 10^{21})$, 求$\sum\limits_{i=1}^n gcd(\lfloor\sqrt[3]{i}\rfloor,i)\mod 998244353$ 首先立方根 ...
- 2019牛客多校一 H. XOR (线性基)
大意: 给定序列, 求所有异或和为$0$的子序列大小之和. 先求出线性基, 假设大小为$r$. 对于一个数$x$, 假设它不在线性基内, 那么贡献为$2^{n-r-1}$ 因为它与其余不在线性基内数的 ...
- Admui相关第三方插件
ace 版本:1.2.3au 官网:https://github.com/ajaxorg/ace-builds/ 许可:BSD 依赖:无 DataAPI:data-pulgin="ace&q ...
- idea jetty:run 启动
1.首先pom 文件 <!-- jetty插件 --> <plugin> <groupId>org.mortbay.jetty</groupId> ...