当前位置:  编程技术>移动开发
本页文章导读:
    ▪设计准则杂记        设计原则杂记 不遵循原则的后果可能不会出问题,但会使出问题的几率变大。   【里氏替换原则】面向接口编程,子类尽量不要覆盖父类方法,即将需要覆盖则重写接口的方法或者是抽象.........
    ▪ 透过反射生成RequestParams        通过反射生成RequestParams public static RequestParams getRequestParamsFromObject(Object obj) { RequestParams params = new RequestParams(); Class classType = obj.getClass(); Field[] fields = classType.getDeclaredFields(); if (fields != .........
    ▪ 郑重使用volatile关键字       慎重使用volatile关键字 volatile关键字相信了解Java多线程的读者都很清楚它的作用。volatile关键字用于声明简单类型变量,如int、float、boolean等数据类型。如果这些简单数据类型声明为volatile.........

[1]设计准则杂记
    来源: 互联网  发布时间: 2014-02-18
设计原则杂记

不遵循原则的后果可能不会出问题,但会使出问题的几率变大。

 

【里氏替换原则】面向接口编程,子类尽量不要覆盖父类方法,即将需要覆盖则重写接口的方法或者是抽象类的抽象函数,而不要去重写一些已经实现了得方法。

 

【依赖倒置原则】面向接口编程

 

【Strategy】面向接口编程,优先组合非继承。


    
[2] 透过反射生成RequestParams
    来源: 互联网  发布时间: 2014-02-18
通过反射生成RequestParams
public static RequestParams getRequestParamsFromObject(Object obj) {
		RequestParams params = new RequestParams();

		Class classType = obj.getClass();

		Field[] fields = classType.getDeclaredFields();
		if (fields != null) {
			int length = fields.length;
			for (int i = 0; i < length; i++) {
				Field field = fields[i];
				String fieldName = field.getName();
				String getMethodName = "get"
						+ fieldName.substring(0, 1).toUpperCase()
						+ fieldName.substring(1);
				try {
					Method getMethod = classType.getMethod(getMethodName,
							new Class[] {});
					Object value = getMethod.invoke(obj, new Object[] {});
					if (value instanceof File) {
						try {
							params.put(fieldName, (File) value);
						} catch (FileNotFoundException e) {
							e.printStackTrace();
						}
					} else {
						params.put(fieldName,
								value != null ? String.valueOf(value)
										: (String) null);
					}
				} catch (NoSuchMethodException e) {
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				}
			}
		}

		return params;
	}

    
[3] 郑重使用volatile关键字
    来源: 互联网  发布时间: 2014-02-18
慎重使用volatile关键字
volatile关键字相信了解Java多线程的读者都很清楚它的作用。volatile关键字用于声明简单类型变量,如int、float、boolean等数据类型。如果这些简单数据类型声明为volatile,对它们的操作就会变成原子级别的。但这有一定的限制。例如,下面的例子中的n就不是原子级别的:

package mythread;

public class JoinThread extends Thread
{
    public static volatile int n = 0;
    public void run()
    {
        for (int i = 0; i < 10; i++)
            try
        {
                n = n + 1;
                sleep(3); // 为了使运行结果更随机,延迟3毫秒

            }
            catch (Exception e)
            {
            }
    }

    public static void main(String[] args) throws Exception
    {

        Thread threads[] = new Thread[100];
        for (int i = 0; i < threads.length; i++)
            // 建立100个线程
            threads[i] = new JoinThread();
        for (int i = 0; i < threads.length; i++)
            // 运行刚才建立的100个线程
            threads[i].start();
        for (int i = 0; i < threads.length; i++)
            // 100个线程都执行完后继续
            threads[i].join();
        System.out.println("n=" + JoinThread.n);
    }
}

     如果对n的操作是原子级别的,最后输出的结果应该为n=1000,而在执行上面积代码时,很多时侯输出的n都小于1000,这说明n=n+1不是原子级别的操作。原因是声明为volatile的简单变量如果当前值由该变量以前的值相关,那么volatile关键字不起作用,也就是说如下的表达式都不是原子操作:

n = n + 1;
n++;

      如果要想使这种情况变成原子操作,需要使用synchronized关键字,如上的代码可以改成如下的形式:
package mythread;

public class JoinThread extends Thread
{
    public static int n = 0;

    public static synchronized void inc()
    {
        n++;
    }
    public void run()
    {
        for (int i = 0; i < 10; i++)
            try
            {
                inc(); // n = n + 1 改成了 inc();
                sleep(3); // 为了使运行结果更随机,延迟3毫秒

            }
            catch (Exception e)
            {
            }
    }

    public static void main(String[] args) throws Exception
    {

        Thread threads[] = new Thread[100];
        for (int i = 0; i < threads.length; i++)
            // 建立100个线程
            threads[i] = new JoinThread();
        for (int i = 0; i < threads.length; i++)
            // 运行刚才建立的100个线程
            threads[i].start();
        for (int i = 0; i < threads.length; i++)
            // 100个线程都执行完后继续
            threads[i].join();
        System.out.println("n=" + JoinThread.n);
    }
}

    上面的代码将n=n+1改成了inc(),其中inc方法使用了synchronized关键字进行方法同步。因此,在使用volatile关键字时要慎重,并不是只要简单类型变量使用volatile修饰,对这个变量的所有操作都是原来操作,当变量的值由自身的上一个决定时,如n=n+1、n++等,volatile关键字将失效,只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m + 1,这个就是原级别的。所以在使用volatile关键时一定要谨慎,如果自己没有把握,可以使用synchronized来代替volatile。

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
c/c++开源软件 iis7站长之家
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3