volatile和transitent用在方法定义上是什么意思?

taolei 2004-03-09 04:54:31
在JDK1.5的java.io.PrintStream里有如下几个函数
public volatile Appendable append(char) throws java.io.IOException
public java.io.PrintStream append(char) throws java.io.IOException //注意:这个函数跟上一个同名同参数!
public volatile Appendable append(CharSequence) throws java.io.IOException
public java.io.PrintStream append(CharSequence) throws java.io.IOException //这个也是!
public transient java.io.PrintStream format(java.util.Locale, String, Object[])
public transient java.io.PrintStream format(String, Object[])
public transient java.io.PrintStream printf(String, Object[])
public transient java.io.PrintStream printf(java.util.Locale, String, Object[])

这几个函数没有出现在1.4x以前的版本里,并且很奇怪的出现了volatile和transitent的Modifier,我这可是第一次见到volatile和transitent用在方法定义上。而且append方法有两个相互冲突的定义。真是怪了。
...全文
171 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
taolei 2004-03-17
  • 打赏
  • 举报
回复
shine333(enihs:
有道理。这个特性倒是还可以。

不过,class实现该特性的方法实在不敢恭维。
因为在class里为了实现那个接口会多出个同名同参数的方法,
(用volatile标记)这已经跟以前版本不兼容了,许多用到reflect
的程序可能都要加以改动。我也是因为以前写的好好的程序出了问题
才发现这个所问题的。这个特性更多的是给我带来麻烦。

至于把transient用在方法定义上,我猜可能是用于Class对象序列化的
兼容上的,一个对象本身的Class在序列化时是只传递Class名字和它的
接口定义的摘要。标记volatile和transient的可能做就不计算在内了。


shine333 2004-03-16
  • 打赏
  • 举报
回复
查阅1.5的src,里面肯定是没有将这两个Modifiers用于修饰Method

其次这两个方法是
public PrintStream append(CharSequence csq) throws IOException 和
public PrintStream append(char c) throws IOException
因此并没有冲突


程序没有运行过,关于为什么会出现上面的现象,不知道大家有没有注意到,这两个关键字出现的地方Method都是有返回值的,而且所返回的对象类型都是在@since 1.5或者在1.5里面有实质改动的,所以......
shine333 2004-03-16
  • 打赏
  • 举报
回复
这个新特性无论从语法上,还是从逻辑上,我认为都是很合理的
shine333 2004-03-16
  • 打赏
  • 举报
回复
Appendable append(char)其实就是PrintStream apppend(char)
这个是上次有人问extends PrintStream用1.5编译不通过时,发现的。

PrintStream implements Appendable,但是无论看src还是api都没有发现Appendable接口中的返回类型为Appendable的方法,所以就猜想有问题。结果让我发现了这个1.5里面的新特性,implemention可以以接口中定义的返回类型的子类型来作为返回类型,如下例

C:\Program Files\Java\j2sdk1.5.0\bin>type D:\j2sdk1.4.1_01\Test.java
public class Test implements A {
public Test a() {
return this;
}
}

interface A {
A a();
}


C:\Program Files\Java\j2sdk1.5.0\bin>javac -verbose D:\j2sdk1.4.1_01\Test.java
[D:\j2sdk1.4.1_01\Test.java を構文解析開始]
[110ms で構文解析完了]
[ソースファイルの検索パス: [D:\j2sdk1.4.1_01\myproject\classes]]
[クラスファイルの検索パス: [C:\Program Files\Java\j2sdk1.5.0\jre\lib\rt.jar, C:\Program Files\Java\j
2sdk1.5.0\jre\lib\jsse.jar, C:\Program Files\Java\j2sdk1.5.0\jre\lib\jce.jar, C:\Program Files\Javaj2sdk1.5.0\jre\lib\charsets.jar, C:\Program Files\Java\j2sdk1.5.0\jre\lib\ext\dnsns.jar, C:\Program
Files\Java\j2sdk1.5.0\jre\lib\ext\localedata.jar, C:\Program Files\Java\j2sdk1.5.0\jre\lib\ext\sunjc
e_provider.jar, C:\Program Files\Java\j2sdk1.5.0\jre\lib\ext\sunpkcs11.jar, D:\j2sdk1.4.1_01\myproje
ct\classes]]
[C:\Program Files\Java\j2sdk1.5.0\jre\lib\rt.jar(java/lang/Object.class) を読み込み中]
[Test を確認中]
[D:\j2sdk1.4.1_01\Test.class を書き込み完了]
[A を確認中]
[D:\j2sdk1.4.1_01\A.class を書き込み完了]
[合計 731ms]

C:\Program Files\Java\j2sdk1.5.0\bin>
taolei 2004-03-16
  • 打赏
  • 举报
回复
我在这个帖子的回复几乎都是让你们看清楚我的问题。

shine333(enihs):你有没有数数我列出的append函数有几个?
taolei 2004-03-15
  • 打赏
  • 举报
回复
关注一下啊!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧