谁动了我的代码

抽象即是空,空即是抽象。
posts(43) comments(24) trackbacks(0)
  • BlogJava
  • 联系
  • RSS 2.0 Feed 聚合
  • 管理

News

所有文章版权归我所有,转载请注明出处,谢谢!

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • Android开发(5)
  • C/C++(1)
  • DataBase(3)
  • Java(16)
  • JavaScript(14)
  • WEB前端(1)
  • 编程杂项(2)
  • 网络(1)

随笔档案

  • 2016年5月 (1)
  • 2011年2月 (1)
  • 2010年6月 (3)
  • 2010年5月 (1)
  • 2009年12月 (2)
  • 2009年11月 (1)
  • 2009年10月 (2)
  • 2009年6月 (2)
  • 2009年5月 (1)
  • 2009年4月 (2)
  • 2009年3月 (4)
  • 2009年2月 (1)
  • 2009年1月 (1)
  • 2008年12月 (1)
  • 2008年11月 (1)
  • 2008年10月 (4)
  • 2008年9月 (2)
  • 2008年5月 (5)
  • 2008年3月 (3)
  • 2007年12月 (2)
  • 2007年10月 (1)
  • 2007年9月 (2)
  • 2007年5月 (1)

搜索

  •  

最新评论

  • 1. re: Android之ImageView载入网络上的图片
  • 222222222222222222222
  • --2222222222222222222222222222
  • 2. re: Log4j自带Log Viewer的用法
  • 执行你的根本不行,乱错帖子就在这乱贴,tmd
  • --asdf
  • 3. re: Android之使用私有存储
  • getDir方法创建的文件,会有个app_前缀,请问这怎么去掉呢?
  • --就是宝宝
  • 4. re: Android通用事件造成的生命周期变化情况
  • 我相信以后Android将成为越来越多设备的OS,不光是手持上网设置,冰箱、洗衣机都有可能采用Android。
  • --淘宝网女装春装新款
  • 5. re: Android通用事件造成的生命周期变化情况
  • 不错
  • --歌瑞尔内衣

阅读排行榜

评论排行榜

Log4J基本使用教程

在Log4J中存在几个概念首先介绍一下,最最重要的两个是Logger和Appender(请参考Log4J手册),其实是继承层次以及输出控制。

首先Log4J中总是存在一个rootLogger,即使没有显示配置也是存在的,并且默认输出级别为DEBUG。
其它的logger都继承自这个rootLogger(如果其他logger未单独定义其输出级别)。
Log4J中的层次是用'.'来分隔的,如log4j.logger.com.example.test,这里并不是说log4j.logger后面一定是具体的包名乃至类名,
这个名称可以自定义,我们甚至可以定义一个log4j.logger.A.B.C, 在com.example.test中的类里取名称为A.B的logger,如
Logger logger = Logger.getLogger("A.B")
上例中我们建立了3个logger实例,它们分别是"A"、"A.B"、"A.B.C"。每次我们在系统中取得logger时,并不是新建实例,这些实例是
系统启动的时候就按照配置文件初始化好的(也可能时第一次引用的时候建立的,然后缓存其实例供以后使用,这部分还没有时间研究)。

限制appender叠加性
例1:
log4j.rootLogger=DEBUG, Console
log4j.logger.A=DEBUG, Console
log4j.logger.A.B=INFO, Console
对于logger A.B输出的任何日志会往控制台输出三次,原因是A.B继承A的以及A的父logger的所有appender,
这种继承关系仅仅是把父logger的appender添加到自己的appender列表中,父logger的输出level不会影响
子logger的输出。

例2:限制appender叠加
log4j.rootLogger=DEBUG, Console
log4j.logger.A=DEBUG, Console
log4j.logger.A.B=INFO, Console
log4j.additivity.A.B=false
logger A.B的日志仅会输出到自己Console中,不会继承任何父logger的appender。

控制appender的输出级别
若想对输出到appender中的日志级别进行限制的话,就需要用到threshold来控制。
log4j.threshold=ERROR 用来控制所有的appender,即输出到所有appender的日志,
不管原来是什么级别的,都不能低于threshold所规定的级别。

log4j.appender.Console.threshold=ERROR 用来控制指定的appender的输出级别。



posted @ 2009-02-17 11:43 Eric Song 阅读(3608) | 评论 (0) | 编辑 收藏

JavaScript注意事项(不定期更新)

   本贴将不定期更新,将集合JavaScript使用中常见的问题。
  约定:浏览器名称IE/FF(通指Windows平台上的IE、FF)、IE5.5+/FF2+(后面的数字表示版本,甚至可以有更详细的版本信息)
  目前只测试IE和FF,其他浏览器不在测试范围内,如果我只提及IE的,则说明在IE中有问题,而在FF中没有问题。
  1. IE中Class不能跨窗口引用,即在父窗口定义的SomeClass不能在子窗口中实例化,如new opener.SomeClass()。请注意在这里我没有提到frame的情况,因为我还没有时间测试,如果哪位有时间测试请告诉我结果。
  2. IE中delete操作只能删除JavaScript或自定义对象的属性,而不能删除HTML Element对象的属性,如果想删除Element的属性,请使用removeAttribute()方法。
  3. IE中delete操作只能删除非var定义的变量。 
  4. IE中如果在一个窗口引用一个对象,如果这个对象是在其他窗口建立的,但是那个窗口已经关闭了,那么对这个对象的引用将会出错。
          如在窗口A中
          opener.someClassObj = new SomeClass();
          window.close();
          窗口B中
          typeof someClassObj 结果是 'object', 但是实际引用该对象却会出错。
        

posted @ 2009-01-19 10:42 Eric Song 阅读(232) | 评论 (0) | 编辑 收藏

在定义一个js类的时候,为什么要设置该类的prototype属性为它所要继承的类的实例对象

在些JavaScript类定义的时候,大家很可能都写过下面的代码:
function A() {}
function B() {}
B.prototype = new A()

上面这样写是为了让instanceof语句能起作用。举个例子:
1.不重写子类的prototype属性
b = new B();
b instanceof B  //return true
b instanceof A // return false
b instanceof Object //return true

2.写子类的prototype属性
b = new B();
b instanceof B //return true
b instanceof A //return true
b instanceof Object //return true

另外,prototype的作用是可以用来模拟继承,使我们在父类里添加的属性方法在子类里能访问。
但是我们可以使用一种其他的方法来变通。

function A(x) {
    this.x = x;
    this.method1 = functioni () {};
}

function B(x,y) {
    A.call(this,x);
    this.y = y;
}

b  =  new B(1, 2)

这时b中绝对有x,并且x 等于1,但是我们为什么还要使用prototype呢?
主要是为了向父类原型动态添加的属性和方法可以出现在子类的实例对象中。
接着上面的例子

A.prototype.z = function () {}

如果我们没有设置B.prototype = new A(),则b不会动态添加方法z 。

posted @ 2008-12-05 14:24 Eric Song 阅读(442) | 评论 (0) | 编辑 收藏

JavaScript 类型转换注意事项

注:部分摘自《JavaScript: The Definitive Guide, 5th Edition》

字符型转换为数值型可以使用下列方法
parseInt(stringVar);     //parseInt还可以指定二进制、八进制、或16进制
parseFloat(stringVar);
Number(stringVar);

for example:
parseInt("ff")    //will throw a error
parseInt("ff", 16) == parseInt("0xff")     // return 255
parseInt("77")    //return 77
parseInt("077") == parseInt("77", 8)    // return 63
注:加"0"或"0x"前缀会自动检测并转换为相应的数制所表示的值
If parseInt( ) or parseFloat( ) cannot convert the specified string to a number, it returns NaN


数值型转换为字符型
numberVar + "";
numberVar.toString();   //可以指定二进制、八进制、或16进制
String(numberVar);

other useful method
var n = 123456.789;
n.toFixed(0); // "123457"
n.toFixed(2); // "123456.79"
n.toExponential(1); // "1.2e+5"
n.toExponential(3); // "1.235e+5"
n.toPrecision(4); // "1.235e+5"
n.toPrecision(7); // "123456.8"

其实还有一种方法就是使用new操作符,如
new String(numberVar);
new Numer(stringVar);
但是这种方法返回的结果是object类型,而不是原始数据类型,大家可以酌情使用。

另外,在相等判断时使用' == '会自动转型(具体转换情况请参考其他资料),如果想精确判断请使用' === '。
如   1 == '1'    //return true
       1 === '1' //return false
       1 == new Number(1)   //return true
       1 === new Number(1)   //return false

数值连接等相关操作
"21" + "2" == "21" + 2  //return 212
2 + "21"   //return 221
"21" * "2" == "21" * 2 == 2 * "21"  //return 42
"21" / "3" == "21" / 3 == 21 / "3"  //return 7
"21" - "2" == "21" - 2  == 21 - "2" == 21 - "    2    "  //return 19

正如和Java中一样,new Number(3) == new Number(3)返回false,同理推广到其他类型,new操作符总是建立一个新对象,
而==只是比较其引用,并不比较对象本身,所以两个new的对象的引用总是不同的。所以在通常的逻辑判断中(如if或while等),
最好避免使用Primitive Datatype Wrapper,而直接使用Primitive Datatype。

From Wrapper to Primitive, for example:
new Number(3).valueOf()
new String("str").valueOf()
new Date().valueOf()        //convert a Date to millisecond representation
[any other object].valueOf()    //The primitive value associated with the object, if any. If there is no value associated with object, returns the object itself.

Finally, note that any number, string, or boolean value can be converted to its corresponding wrapper object with the Object( ) function:

var number_wrapper = Object(3);



Automatic datatype conversions

Value

Context in which value is used


String

Number

Boolean

Object

Undefined value

"undefined"

NaN

false

Error

null

"null"

0

false

Error

Nonempty string

As is

Numeric value of string or NaN

TRue

String object

Empty string

As is

0

false

String object

0

"0"

As is

false

Number object

NaN

"NaN"

As is

false

Number object

Infinity

"Infinity"

As is

true

Number object

Negative infinity

"-Infinity"

As is

TRue

Number object

Any other number

String value of number

As is

true

Number object

true

"true"

1

As is

Boolean object

false

"false"

0

As is

Boolean object

Object

toString( )

valueOf( ), toString( ), or NaN

true

As is


利用上面的表,我们可以知道if ("") 、if (0)、if (undefined)、if (null)、if (NaN),这些if语句的条件都为false.



posted @ 2008-11-14 09:32 Eric Song 阅读(1988) | 评论 (1) | 编辑 收藏

使用Java范型需要注意的地方

  1. 静态方法要想范化,需要指定其类型参数
  2. 非范化类型中的实例方法要想范化,也需要制定其类型参数。
  3. 范化类型中的实力方法可以直接使用其类型本身的类型参数。
  4. 范型不是协变的,即List<Integer>不是List<Number>的子类。
  5. 不能实例化范型类型的数组,即new List<String>[3] 是不合法的,除非类型参数是一个未绑定的通配符,即new List<?>[3] 是合法的。
  6. 构造延迟,在代码编写时我们不能通过类型参数来构造一个该类型的实例,原因是我们不知道如何构造,类型参数的实际类型是在运行时确定的。
  7. 对于注意5所描述的问题我们有一个解决方法是List<String> list = (List<String>[]) new Object[3];但是如果是运行时建立数组呢,类型信息是运行时确定的,那就换种写法T[] tarray = (T[]) new Object[3];
  8. 上面的数组构造是不被推荐的,最好的方法是将类型信息传递到方法中,如method(Class<V> type) { V[] array = (V[])Array.newInstance(type, length); },可以参考ArrayList类的toArray(T[] a)方法的实现。
  9. 构造通配符引用,如果set是一个Set<?>类型,则Set<?> set2 = new HashSet<?>(set);是不合法的,改成Set<?> set2 = new HashSet<Object>(set);就合法了。
最后,推荐三篇IBM上的文章

多角度看 Java 中的泛型

了解泛型

使用通配符简化泛型使用

posted @ 2008-10-23 13:59 Eric Song 阅读(1481) | 评论 (2) | 编辑 收藏

Java事件传递技术 (链接至IBM网站)

IBM开发者乐园上的教程(需注册才能浏览,建议注册一个帐号,IBM网站上有很多好文章),很详细的介绍了3种粒度模型(对象、属性、事件)。
Java事件传递技术

posted @ 2008-10-22 16:01 Eric Song 阅读(325) | 评论 (0) | 编辑 收藏

Java集合框架使用注意事项(二,Map)

Map接口常用的实现类有:
1.HashMap
2.Hashtable
3.TreeMap
4.LinkedHashMap

讨论1:底层机制
HashMap与Hashtable基于数组实现,TreeMap基于树型结构,底层存储结构是典型的链表结构。LinkedHashMap继承自HashMap,所以也是基于数组实现的。

讨论2:继承关系
HashMap与TreeMap继承自AbstractMap,Hashtable继承自Dictionary,LinkedHashMap继承自HashMap。

讨论3:同步关系
Hashtable是同步的,而HashMap与TreeMap以及LinkedHashMap不是同步的,可以使用Collections中提供的方法转换为同步的。

讨论4:迭代器
迭代器都是快速失败的(注:参考本系列第一篇List篇)

讨论5:不可修改
通过使用Collections.unmodifiableMap(Map map)来转换

posted @ 2008-10-22 12:59 Eric Song 阅读(1785) | 评论 (1) | 编辑 收藏

Java集合框架使用注意事项(一, List)

List的有用实现
1.ArrayList
2.LinkedList
3.Vector
4.Stack

讨论1:底层机制(牵扯到的数据结构的知识请读者自行复习)
ArrayList与Vector都是基于数组实现的,这就说明ArrayList与Vector适合做遍历而不适合做频繁的插入和删除。
LinkedList是基于链表实现的,所以它生来就是为了频繁插入与删除对象。

讨论2:特殊功能
Stack是一个后进先出(LIFO)对象堆栈,而LinkedList除可以被用作堆栈外,还可以被用作队列或双端队列。
不同的是Stack继承自Vector,也就是说它也是基于数组实现的。

讨论3:内存占用
基于数组实现的List,在动态扩展时会产生新的数组,然后把旧数组里的内容复制到新数组里,
这会产生大量的不再被使用的对象引用变量等待系统回收。而基于链表实现的List就不会有这种问题。

讨论4:同步问题
Vector与Stack生来就是同步的, 而ArrayList与LinkedList需要使用Collections.synchronizedList(List list)方法来转换成同步List。
从它们的对象上返回的迭代器是快速失败的,也就是说在使用迭代器进行迭代的时候,必须使用迭代器本身的remove、add、set
方法来添加或更改List元素,如果在迭代的同时,在其他线程中从结构上修改了List(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改),快速失败迭代器会尽最大努力抛出ConcurrentModificationException。

讨论5:使用策略
如果数据被从数据源提取,数据量不确定,该数据一经被提取后就几乎不会再添加或删除,那么应该建立一个LinkedList来保存从数据源中取出的数据,然后将该LinkedList转换成ArrayList来优化遍历操作。反过来,数据量确定的数据从数据源取出可以先建立一个ArrayList来保存,根据需要如需频繁增删,就转换为LinkedList,如频繁遍历就不需转换。
转换的方法就是使用对应的List类来封装目标List对象。如
ArrayList al = new ArrayList();
LinkedList ll = new LinkedList(al);
同理反过来也可以
LinkedList ll = new LinkedList();
ArrayList al = new ArrayList(ll);

讨论6:toArray()方法
基于数组实现的List会直接返回一个底层数组的拷贝(使用了System.arraycopy方法),基于链表实现的List会新生成一个数组。

讨论7:不可修改
通过使用Collections.unmodifiableList(List list)来生成一个不可修改的List,试图修改返回的列表,不管是直接修改还是通过其迭代器进行修改,都将导致抛出UnsupportedOperationException。

讨论8:遍历器
请尽量使用Iterator,Enumeration已不被鼓励使用。

最后,请参考java.util.Collections类,该类提供了很多有用的操纵集合对象的方法。





posted @ 2008-10-22 11:22 Eric Song 阅读(2427) | 评论 (1) | 编辑 收藏

面向对象的JavaScript(二,TSS上的一篇文章,先借鉴一下)

 Object Oriented JavaScript Demonstrated

posted @ 2008-09-17 20:15 Eric Song 阅读(1125) | 评论 (0) | 编辑 收藏

面向对象的JavaScript (一、对象基础,使用函数来模拟类)

通过一个例子可以很直观的表述本主题,所以没有任何其他的说明文字,请看代码吧。
  1function Person(name, age) {
  2
  3    //私有变量(private variables)
  4    var myName = name;
  5    var myAge = age;
  6
  7    //公共属性(public properties)
  8    this.name = myName;
  9    this.age = myAge;
 10    
 11    //私有函数(private functions)
 12    function getMyName() {
 13    return myName;
 14    }
;
 15    
 16    function getName() {
 17    return name;
 18    }
;
 19    
 20    var getMyAge = function () {
 21    return myAge;
 22    }
;
 23    
 24    var getAge = function () {
 25    return age;
 26    }
;
 27    
 28    //特权方法(privileged methods)
 29    this.getName = function () {
 30    return this.name;
 31        //return myName;       可以访问私有变量
 32    //return name;         可以访问构造函数参数(其参数本质也是私有变量)
 33    //return getMyName();  可以访问私有函数
 34    //return getName();    可以访问私有函数
 35    }
;
 36    
 37    this.getAge = function () {      
 38    return getAge();   
 39    }
;
 40    
 41    this.getRealAge = function () {
 42    return this.age;
 43    }
;
 44}

 45
 46//公共方法(public methods)
 47Person.prototype.acceptName = function (param) {
 48    this.name = param;
 49    //name = param;       公共方法不能访问私有变量
 50    //myName = param;     公共方法不能访问私有变量
 51}
;
 52
 53//原型属性(prototype properties)
 54Person.prototype.legs = 2;
 55
 56//静态属性(static properties)
 57//整个类只有一个静态属性,各个对象共享同一个静态属性值
 58Person.arms = 2;
 59
 60Person.getArms = function () {
 61    return Person.arms;
 62    //return this.arms;   可以使用this来指代Person对象本身
 63}
;
 64
 65/**//*
 66Person是一个逻辑上的类,他的本质是一个Function,在JavaScript中类是由Function来模拟的,所以Person还是一个Function的实例。而arms和getArms方法是一个Function对象实例上的属性和方法,是Person对象所特有的,所以本例可以使用Person.arms来引用,同时在getArms方法中,可以使用this.arms来引用,因为getArms是Person对象上的方法,在该方法内部this指代Person对象自身。
 67*/

 68alert(Person.getArms());
 69
 70var pa = new Person("Teddy", 25);
 71
 72//alert(pa.myName);  不能访问私有变量
 73
 74alert(pa.name);
 75
 76alert(pa.getAge());
 77
 78pa.acceptName("Born");
 79
 80alert(pa.getName());
 81
 82var pb = new Person("John", 18);
 83
 84//运行时动态加入方法
 85Person.prototype.acceptAge = function (param) {
 86    this.age = param;
 87}
;
 88
 89//pb对象也可以调用动态添加的方法
 90pb.acceptAge(30);
 91
 92alert(pb.getAge());
 93
 94alert(pb.getRealAge());
 95
 96//运行时覆盖已定义方法
 97Person.prototype.acceptName = function (param) {
 98    return param;
 99}
;
100
101//所有已创建对象都自动继承被覆盖的方法
102alert(pa.acceptName("Black"));
103
104alert(pa.getName());
105
106alert(pa.legs);
107
108//运行时改变原型属性值
109Person.prototype.legs = 4;
110
111//所有已创建对象都自动继承被改变的原型属性值
112alert(pb.legs);
113
114//运行时将原型属性改为公共方法
115Person.prototype.legs = function () {
116    return 4;
117}
;
118
119//所有已创建对象都自动继承原型属性到公共方法的改变
120alert(pa.legs());

posted @ 2008-09-03 19:09 Eric Song 阅读(1291) | 评论 (1) | 编辑 收藏

仅列出标题
共5页: 上一页 1 2 3 4 5 下一页 
 
Powered by:
BlogJava
Copyright © Eric Song