﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-软件工程实践者-随笔分类-Java Domain</title><link>http://www.blogjava.net/robin/category/6575.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 18 Sep 2016 09:11:09 GMT</lastBuildDate><pubDate>Sun, 18 Sep 2016 09:11:09 GMT</pubDate><ttl>60</ttl><item><title>Java 8 Repeatable注解的使用</title><link>http://www.blogjava.net/robin/archive/2016/09/06/431753.html</link><dc:creator>软件工程实践者</dc:creator><author>软件工程实践者</author><pubDate>Tue, 06 Sep 2016 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/robin/archive/2016/09/06/431753.html</guid><wfw:comment>http://www.blogjava.net/robin/comments/431753.html</wfw:comment><comments>http://www.blogjava.net/robin/archive/2016/09/06/431753.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robin/comments/commentRss/431753.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robin/services/trackbacks/431753.html</trackback:ping><description><![CDATA[Java 8之前，同一注解不能在相同的目标元素上多次使用，例如，如下的注解在Java 8之前是不允许的：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;SampleClass&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Quality("Security")<br />&nbsp;&nbsp;&nbsp;&nbsp;@Quality("Performance")<br />&nbsp;&nbsp;&nbsp;&nbsp;@Quality("Readability")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;foo(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br />Java 8引入了Repeatable注解（@Repeatable）可以解决这一问题，但光有可重复的注解定义还不够，还需要它的容器注解，两者一起来实现可重复注解的使用。实例如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Target(ElementType.METHOD)<br />@Retention(RetentionPolicy.SOURCE)<br />@Repeatable&nbsp;(Qualities.<span style="color: #0000FF; ">class</span>)<br /><span style="color: #0000FF; ">public</span>&nbsp;@<span style="color: #0000FF; ">interface</span>&nbsp;Quality&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value();<br />}</div><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Target(ElementType.METHOD)<br /><span style="color: #0000FF; ">public</span>&nbsp;@<span style="color: #0000FF; ">interface</span>&nbsp;Qualities&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Quality[]&nbsp;value();<br />}</div><br />其中，Quality是可重复注解，由@Repeatable注解标明，它的容器注解是Qualities，用于存放所有可重复的Quality（存贮在Quality[]中）；同时还要注意可重复注解和它的容器注解的目标元素必须是一样的（这也不言自明）。如此这般，我们最开始的&nbsp;<strong>SampleClass&nbsp;</strong>在Java 8环境下就可以安全使用了。<br /><br /><br /><img src ="http://www.blogjava.net/robin/aggbug/431753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robin/" target="_blank">软件工程实践者</a> 2016-09-06 16:24 <a href="http://www.blogjava.net/robin/archive/2016/09/06/431753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Bill Push的单例模式实现</title><link>http://www.blogjava.net/robin/archive/2016/09/03/431736.html</link><dc:creator>软件工程实践者</dc:creator><author>软件工程实践者</author><pubDate>Sat, 03 Sep 2016 01:37:00 GMT</pubDate><guid>http://www.blogjava.net/robin/archive/2016/09/03/431736.html</guid><wfw:comment>http://www.blogjava.net/robin/comments/431736.html</wfw:comment><comments>http://www.blogjava.net/robin/archive/2016/09/03/431736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robin/comments/commentRss/431736.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robin/services/trackbacks/431736.html</trackback:ping><description><![CDATA[以下单例实现思想来自《Java Design Patterns: A Programmer's Approach》.<br />该方法利用了Java缺省的Lazy类实例化机制克服了传统单例模式实现中Lazy实例化方式的不足。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Singleton&nbsp;{<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Singleton(){}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Singleton&nbsp;getInstance(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Helper.instance;<br />&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Helper&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Singleton&nbsp;instance&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Singleton();<br />&nbsp;&nbsp;&nbsp;}<br />}</div><img src ="http://www.blogjava.net/robin/aggbug/431736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robin/" target="_blank">软件工程实践者</a> 2016-09-03 09:37 <a href="http://www.blogjava.net/robin/archive/2016/09/03/431736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mustang(jdk1.6)特性</title><link>http://www.blogjava.net/robin/archive/2006/01/11/27569.html</link><dc:creator>软件工程实践者</dc:creator><author>软件工程实践者</author><pubDate>Wed, 11 Jan 2006 05:10:00 GMT</pubDate><guid>http://www.blogjava.net/robin/archive/2006/01/11/27569.html</guid><wfw:comment>http://www.blogjava.net/robin/comments/27569.html</wfw:comment><comments>http://www.blogjava.net/robin/archive/2006/01/11/27569.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/robin/comments/commentRss/27569.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robin/services/trackbacks/27569.html</trackback:ping><description><![CDATA[<STRONG>1. 提供了磁盘分区 - 空间方法<BR><BR></STRONG>在File类中增加了以下方法：<BR><B>public long getFreeSpace(): </B>返回一个分区剩余空间<BR><B>public long getTotalSpace(): </B>返回一个分区总空间<BR><B>public long getUsableSpace():</B> 返回一个分区已用空间<BR>注意，以上File指代的虚拟路径必须是盘符，否则返回0。<BR><BR><STRONG>2. Splash Screen<BR><BR></STRONG>Mustang对于Splash Screen的实现是一个用来显示gif（可以是动画式的）,PNG, jpg图片的没有修饰的窗口<BR>使用方式：<BR>在java命令行中加入 -splash 选项,示例如下：<BR><B>java -splash mypic.jpg HelloWorld</B><BR><BR>如果你的类是以jar的方式来运行，那么可以在jar文件的MANIFEST.MF文件中加入如下的一行：<BR><B>SplashScreen-Image:mypic.jpg</B><BR><BR>你也可以在命令行中写：<BR>java -splash:mypic.jpg -jar helloWorld.jar<BR>这里用的图片将替代MANIFESET.MF中定义的图片（如果有的话）<BR><BR>为了实现自定义的Splash Screen界面，你可以使用如下的方法：<BR><BR>//使用SplashScreen的静态方法获得SplashScreen对象，然后自定义<BR>SplashScreen ss = SplashScreen.getSplashScreen ();<BR>if (ss != null)<BR>{<BR>// 自定义代码。<BR>}<BR><BR>在SpalshScreen中还提供了如下方法，具体使用请看JDK或访问sun网站<BR>public Graphics getGraphics()<BR>public URL getImageURL()<BR>public Dimension getSize()<BR>public void setImageURL(URL imageURL):<BR>public void update()<BR><BR>值得注意的是：你必须使用 -spalsh选项或MANIFEST.MF的方式来调用SplashScreen，<BR>否则修改是无效的。<img src ="http://www.blogjava.net/robin/aggbug/27569.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robin/" target="_blank">软件工程实践者</a> 2006-01-11 13:10 <a href="http://www.blogjava.net/robin/archive/2006/01/11/27569.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何编写子定义annotation及使用JDK5.0 annotation包中的annotations</title><link>http://www.blogjava.net/robin/archive/2006/01/02/26309.html</link><dc:creator>软件工程实践者</dc:creator><author>软件工程实践者</author><pubDate>Mon, 02 Jan 2006 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/robin/archive/2006/01/02/26309.html</guid><wfw:comment>http://www.blogjava.net/robin/comments/26309.html</wfw:comment><comments>http://www.blogjava.net/robin/archive/2006/01/02/26309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robin/comments/commentRss/26309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robin/services/trackbacks/26309.html</trackback:ping><description><![CDATA[这一小节介绍如何编写一个自定义的注解类型，以及如何应用JDK5.0 java.lang.annotation包中提供的4种注解：<BR>@Documented，@Retention，@Target，@Inherited<BR><BR><B>1. 编写自定义@Todo注解</B><BR>经常我们在写程序时，有时候有些功能在当前的版本中并不提供，或由于某些其它原因，有些方法没有完成，而留待以后完成，我们在javadoc中用@TODO来描述这一行为，下面用java注解来实现。<BR><BR><B>public @interface Todo { } // Todo.java</B><BR><BR>如果你想让这个注解类型能够自省的话，给它加上@Todo注解，写法如下：<BR><BR><B>@Todo<BR>public @interface Todo{ }</B><BR><BR>下面我们给这个注解接受参数的能力，代码如下：<BR>
<DIV class=xoopsCode><CODE><PRE>@Todo("Just articleware")
public @interface Todo{
  public enum Priority { LOW, MEDIUM, HIGH }
  String value();
  String[] owners() default "";
  Priority priority() default Priority.MEDIUM;
}</PRE></CODE></DIV><BR><B><FONT color=#ff0000>注意</FONT>：</B>注解类性所能接受的参数类型有着严格的规则：<BR>a. 参数类型只能是：primitive, String, Class, enum, annotation, 或者是数组；<BR>b. 参数值不能为空，因此每一个参数值都要定义一个缺省值； <BR>c. 名字为value的参数可以用简便的方法来设置； <BR>d. 参数的写法如同写简单方法（看如上代码），不允许加入参数，不允许有throws子句等。<BR><BR>在上面的代码中，我们为@Todo定义了3个参数, 分别是value, owners, priority. 注意：由于value的特殊性，它的的却省值可以由上面代码中的"Just articleware"来定义，当然你也可以单独写一个缺省值。<BR><BR>下面看一个应用@Todo注解的例子：<BR>
<DIV class=xoopsCode><CODE><PRE>@Todo(
  value="Class scope",
  priority=Unfinished.Priority.LOW
)
public class TodoDemo {

  @Todo("Constructor scope")//通过快捷方式，设置value的值
  public TodoDemo() { }

  @Todo(owner="Jason", value="Method scope")
  public void foo() { }
}</PRE></CODE></DIV><BR>上面的代码很简单，不多介绍。<BR><BR>下面我们想让@Todo不能应用在fields, parameters, 或者local variables（因为这对我们来说没有意义）；它应当可以出现在javadoc中；在运行是具有持久性。要实现这些特性，就需要annotation包的支持啦。 <BR><BR><B>2. 应用annotation包的支持</B><BR><BR>1）@Documented <BR>类和方法的annotation缺省情况下是不出现在javadoc中的，为了加入这个性质我们用@Documented<BR>应用代码如下(简单，不多介绍）：<BR>
<DIV class=xoopsCode><CODE><PRE>package com.robin;
import java.lang.annotation.*;

@Todo("Just articleware")
@Documented
public @interface Todo{ ...
</PRE></CODE></DIV><BR><BR>2）@Retention <BR>用来表明你的annotation的有效期，可以有三种选择(如图所示)：<BR><IMG alt="" hspace=0 src="http://developer.neusoft.com/uploads/newbb/277_43b88b5d0a733.jpg" align=baseline border=0><BR>以下示例代码应用RUNTIME策略<BR>
<DIV class=xoopsCode><CODE><PRE>package com.robin;
import java.lang.annotation.*;

@Todo("Just articleware")
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Todo{ ...</PRE></CODE></DIV><BR>3) @Target <BR>@Target注解表明某个注解应用在哪些目标上，可选择如下范围: <BR><CODE>
<UL>
<LI>ElementType.TYPE (class, interface, enum) 
<LI>ElementType.FIELD (instance variable) 
<LI>ElementType.METHOD ElementType.PARAMETER 
<LI>ElementType.CONSTRUCTOR 
<LI>ElementType.LOCAL_VARIABLE 
<LI>ElementType.ANNOTATION_TYPE (应用于另一个注解上) 
<LI>ElementType.PACKAGE </LI></UL></CODE><BR>按我们的功能要求，代码如下：<BR>
<DIV class=xoopsCode><CODE><PRE>package com.robin;
import java.lang.annotation.*;

@Todo("Just articleware")
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,
 ElementType.CONSTRUCTOR,ElementType.ANNOTATION_TYPE,
 ElementType.PACKAGE})
public @interface Todo{ ...</PRE></CODE></DIV><BR>4) @Inherited <BR>@Inherited表明是否一个使用某个annotation的父类可以让此annotation应用于子类。<BR>示例代码如下：<BR>
<DIV class=xoopsCode><CODE><PRE>package com.robin;
import java.lang.annotation.*;

@Todo("Just articleware")
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,
 ElementType.CONSTRUCTOR,ElementType.ANNOTATION_TYPE,
 ElementType.PACKAGE})
@Inherited
public @interface Todo{
  public enum Priority { LOW, MEDIUM, HIGH }

  String value();
  String[] owners() default "";
  Priority priority() default Priority.MEDIUM;
}</PRE></CODE></DIV><img src ="http://www.blogjava.net/robin/aggbug/26309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robin/" target="_blank">软件工程实践者</a> 2006-01-02 10:31 <a href="http://www.blogjava.net/robin/archive/2006/01/02/26309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2SE 5.0的三种内置注释类型</title><link>http://www.blogjava.net/robin/archive/2006/01/01/26283.html</link><dc:creator>软件工程实践者</dc:creator><author>软件工程实践者</author><pubDate>Sun, 01 Jan 2006 13:41:00 GMT</pubDate><guid>http://www.blogjava.net/robin/archive/2006/01/01/26283.html</guid><wfw:comment>http://www.blogjava.net/robin/comments/26283.html</wfw:comment><comments>http://www.blogjava.net/robin/archive/2006/01/01/26283.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/robin/comments/commentRss/26283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robin/services/trackbacks/26283.html</trackback:ping><description><![CDATA[<DIV class=comText>注解(annotation)是J2SE 5.0的新内容，它给我们提供了很好的编程支持，下面介绍一下其内置的三种注解类型：<BR><BR><STRONG>1. @Override</STRONG><BR><BR><FONT face="Courier New" size=2>@Override用在多态情况下，比如：<BR><BR></FONT>
<DIV class=xoopsCode><CODE><PRE><FONT size=2>public abstract class Animal{
   public void say(){
      System.out.println("annimal is saying");
   }
}

public class Cat extends Animal{
    @Override
    public void say(){
        System.out.println("miao, miao");
    }
}
</FONT></PRE></CODE></DIV><BR><FONT face="Courier New" size=2>通过@Override来告诉java编译器，say方法是重载的父类的方法，这样，当父类的say方法签名改名的话，比如增加了一些参数，那么子类的Cat中的say方法编译时就会报错，说没有正确的重载父类方法，所以，@Override可以帮我们验证程序的正确性，这一点，很有用。<BR></FONT><BR><STRONG>2. @Deprecated <BR></STRONG><BR><FONT face="Courier New" size=2>@Deprecated的意思和JavaDoc中的@deprecated注释在本质上是一样的，使用如下：<BR><BR></FONT><CODE>
<P class=xoopsCode><FONT size=2>public class DeprecatedExample {&nbsp;<BR>&nbsp;&nbsp;&nbsp;@Deprecated&nbsp;<BR>&nbsp;&nbsp;&nbsp;public static void badMethod() { }<BR>}<BR><BR>public class DeprecatedUser {&nbsp;<BR>&nbsp;&nbsp;&nbsp;public static void main(String[] args){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeprecatedExample.badMethod();&nbsp;<BR>&nbsp;&nbsp;&nbsp;} <BR>}<BR></FONT></CODE><BR><FONT face="Courier New" size=1><FONT size=2>上面的代码如果用javac进行编译的话，会打印出如下信息:<BR>Note: DeprecatedUser.java uses or overrides a deprecated API.<BR>Note: Recompile with -Xlint:deprecation for details.<BR>1 error<BR>如果你按提示重新加-Xlint进行编译，你就可以得到错误的详细信息：<BR>% javac -Xlint:deprecation<BR>DeprecatedUser.java:3: warning: [deprecation] badMethod() in DeprecatedExample<BR>has been deprecated<BR>DeprecatedExample.badMethod();<BR><BR>需要注意的是：和javadoc中的@deprecated相比，@Deprecated并没有强大多少，因为它不支持参数，而@deprecated后面还可以跟字符串来给一些相关的信息，但@Deprecated做不到，但它提供了运行时自省的功能，来提示错误，所以建议@Deprecated和@deprecated同时使用。</FONT><BR></FONT><BR><FONT face="宋体, MS Song">&nbsp;<STRONG>3. @SuppressWarnings</STRONG> <BR><BR></FONT><FONT face="Courier New" size=2>顾名思义，就是抑制警告信息的出现，使用如下：<BR></FONT><FONT size=2><CODE>public class DeprecatedExample2{&nbsp;<BR>&nbsp;&nbsp;&nbsp;@Deprecated&nbsp;<BR>&nbsp;&nbsp;&nbsp;public static void foo() { }<BR>}<BR><BR>public class DeprecatedUser2 {&nbsp;<BR>&nbsp;&nbsp;&nbsp;@SuppressWarnings(value={"deprecation"})&nbsp;<BR>&nbsp;&nbsp;&nbsp;public static void main(String[] args) {&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeprecatedExample2.foo();&nbsp;<BR>&nbsp;&nbsp;&nbsp;} <BR>}<BR></CODE><BR></FONT><FONT face="Courier New" size=2>上述@SuppressWarnings(value={"deprecation"})的作用就是抑制编译器报deprecation的错。<BR>@SuppressWarnings(value={"deprecation"})只支持一个参数，是数组类型，所以你可以不用加value, 写成：@SuppressWarnings({"deprecation"})；当想抑制多个类型的警告信息时，可写：@SuppressWarnings({"unchecked","fallthrough",deprecation"}).<BR><BR>注意：在JDK1.5.0 release中，@SuppressWarnings还没有得到完全支持，会在以后支持，但Sun并没有给出具体的时间。</FONT></P></DIV><img src ="http://www.blogjava.net/robin/aggbug/26283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robin/" target="_blank">软件工程实践者</a> 2006-01-01 21:41 <a href="http://www.blogjava.net/robin/archive/2006/01/01/26283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>