常用套路之师弟可能不知道

序言

作为一名有抱负、有理想、有追求的食客,必须记录下这些富含营养的编程时刻。


.class

Collections.emptyList();

当从一个函数当中获取一个数组且我们并不希望返回数组为 null 的情况下,可使用 Collections.emptyList() 来代替 new ArrayList() 或者 new LinkedList(),既可省去对返回数组对象的 null 判断,亦可省去不必要的内存开销。


String[] strs = {"a","b","c"};

List<String> strList = Arrays.asList(strs);// String[]转ArrayList<String>
String[] strs2 = strLs.toArray(new String[strLs.size()]);// ArrayList<String>反转String[]
strList.replaceAll(",","");// 输出"abc"
Collections.swap(strList, 0, 2);// 输出"cba"

拒绝繁琐的工作方式,让便捷成为一种辅助你偷懒的工具。


TextUtils.isEmpty(string);

可以通过 string.equals(null) 判断 string 是否为 null ,但更多时候也需要判断 string 的长度是否为0,即 string.equals(“”) ,但如果 string 为 null 会导致判断时出现 NullPointerException 异常。固然 TextUtils.isEmpty(string) 才是两全齐美的选择。


private static String sExact = "123";

if(sExact.equals(str));// 判断 str 的值是否等同于设定的值 "123"

或许有些人较为习惯 if(str.equals(sExact)); 这种写法,但是你可能不经意忘记 str 它自身存在 null 的情况,所以为了避免其造成 NullPointerException 异常,需要加多个判断 if(null != str && str.equals(sExact)); 。

然而实际上可直接用 if(sExact.equals(str)); 的来代替 if(null != str && str.equals(sExact)); 。前提是已经确认 sExact 为预设常量,并不存在 null 的情况。

PS:之前关于这一点引用 if(null != object) 的形式提及是有误区的,我正在努力自我反省当中。同时也谢谢一楼的评论,否则我不会发现给自己和大家埋了那么大一个坑。


ArrayList<String> mList = ...;

if(null != mList && mList.isEmpty()){};

与 TextUtils.isEmpty() 同理,对于数组内容大小是否为0,引用 isEmpty() 便可直接代替 mList.size() == 0 这一判断。


private final static int ADULT_AGE = 18;

String type = year >= ADULT_AGE ? "young man" : "childer";

可以一行代码解决的判断,就不要依赖 if else 了,更何况这种写法效率更高。


private final static int ADULT_AGE = 18;

public void toXXOO(){
    if(year < ADULT_AGE ){
        Toast.makeText(context, "Minors are not allowed in!", Toast.LENGTH_SHORT).show();
        return;
    }

    ... // do anything
}

这里代码上并没有什么特别之处,只是我们通过 return 省去了 else 编辑以及之后代码的执行,让代码不至于往右方向缩进。当然并非所有环境下都能适用,若判定顺序以及内容比较复杂的情况,仍建议用回 else ,恢复提高代码的可读性。


for(int i = 0, k = list.length(); i < k; i ++);

是不是感到有些许蒙逼了呢? 骚年,其实际上只是帮你上去了一行代码而已,切莫惊慌。


for(Object object : objectList);

继JDK 5.0之后 for 循环的增强版,简化编程。建议使用(除了集合以及需要索引的场景以外)。


.xml

<TextView
    ...
    tools:text="预览效果"
    android:visibility="gone"
    tools:visibility="visible"/>

根布局记得引入 xmlns:tools=”http://schemas.android.com/tools”。简单点说吧, tools 可实现任意属性并实现“预览效果”,但实际代码运行这些属性的设置是不会出现的。


<ViewStub   
    ...
    android:layout="@layout/viewstub_view"/>
viewStub.inflate();
viewStub.setVisibility(View.VISIBLE);

布局的延迟加载,占用资源小。执行 inflate() 时 viewStub 所指向的布局仍然会被实例化,也就是说其依然会占用相应的内存资源。建议使用但实际上并不常用,注意 inflate() 只能执行一次。


<style name="MyTvStyle">
    <item name="android:textSize">@dimen/font_main</item>
    <item name="android:textColor">@color/black</item>
    <item name="android:gravity">center</item>
</style>
<TextView
    ...
    style="@style/MyTvStyle"/>

单个布局以及跨布局出现重复视图样式的情况,建议在 style.xml 当中自定义通用的样式属性,一方面方便布局文件的浏览,减少了代码的编辑量,另一方面还有利于项目的后期维护。


other

  • 尽可能的避免创建全局变量,能局部就局部(打比方 listView.getAdapter(); 既然这里能获取就可以尽量避免 new 一个 Adapter 在
    全局上,当然如果局部调用较为频繁那就给放全局吧);

  • 布局设计尽可能不要过多的嵌套(除非真的没辙,一定要这么做);

  • 无论是代码实现还是 UI 设计,为了创建美好幸福将来,能脱离复用就脱离复用;

  • 接手别人项目的能参考就参考,不能参考得改的就该批量改,不要局部改。

发布了50 篇原创文章 · 获赞 4 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章