捷凌网安JAVA频道
捷凌IT教育
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME 开源技术 其他技术 论坛
 您现在的位置: 捷凌网安 >> Java >> 开源技术 >> Spring >> 正文
Scala—Java的避难所之main(String[])

作者:佚名 责任编辑:左决 点击数: 更新时间:2008-5-11 3:32:41

   你可能已经使用JAVA若干年了,或许java是你接触编程来的第一门编程语言,或许是作为比C++更好的一个选择.不管怎么样,你已经适应了JAVA,并了解她的外观与内在,能够体会它的喜怒与哀乐(原文:You’re comfortable with java, you know its ins and outs, ITs moods).她就像你相处多年的女朋友,或许刚相识时那种激情已经不再,但你已经熟悉怎样才能让她开心.简单的说,如果你是一位工匠,则java就是你干活的工具.

  然而,你和java的蜜月期过去了,你在编程语言的选择上更加务实了.只要有足够的理由,你就可以毫不犹豫去尝试一种新的语言,但JAVA还没有足够的缺陷让你下定决心离开她.此时,你听说了一个叫做Ruby的东东,它的简洁优雅以及巨大的威力给你留下深刻的印象.但你并不是那么确定去使用一个脚步语言来构建你的企业应用.动态类型以及TextMate确实都不错,但对于现实世界,你需要一个更坚实的支柱.作为一个实用主义者,你仍然坚持使用java.

  这时,好消息传来了.一门新的编程语言登上了舞台并在开发者的世界引起了一场风暴.Scala貌似具有你对一门编程语言所期待一切: 静态类型,编译为字节码,简洁且富有表现力的语法.你可能已经被它的一些例子给深深吸引了.它看起来和JAVA非常相似,但是剔除了java中冗余的语法结构.Scala没有分号,没有public static void的方法修饰词,并且具有静态类型推断机制.

  现在剩下的唯一问题就是你应该从何开始.你也许尝试过去Scala的网站查看相关知识,但是..这一切看起来是那么的函数化:Lamdas,high-order functions,immutable state,recursion out the wazoo.突然让人感到前途未卜.

  但是,javaEE的难民们,不必担心.Scala确实是一门函数式的编程语言,但它同样也是命令式的和面向对象的.也就是说,除了书写那种晦涩难懂的函数式代码(原文: It means that you don’t have to write code wITh the sole purpose of pleasing Haskell Curry. ),你还有其它的选择.你可以书写可读性很强的代码,以便你一个星期之后还能看懂它.将你的代码给你那些只使用JAVA的同事看,他们甚至也能看懂它.只需要一个正确的引导,你就可以使用Scala来构建你的的java应用.

  导读:

  如果符合上面所说的,那么这个Scala系列就是为你而准备的.我已经阅读过大量有关Scala的文章以及入门材料(如果你更喜欢函数式的编程,我强烈推荐你去看Alex BlewITt写的系列文章),但很少有文章是为了使java开发比较轻松的转变到Scala来的.我个人缺乏FP(函数式编程)的经验,因此我肯定不会在文章中介绍如何将Scheme代码移植到Scala.该系列文章着重于类比Scala与JAVA,并说明为什么Scala比java更好.

  起步:

  java代码

    

 object HelloWorld extends Application{
  println(
"Hello, World!")
  }
  
object HelloWorld extends Application{
  println(
"Hello, World!")
  }

    
    没有什么比用代码来获得知识更直接了,注意到上面的代码没有使用分号.当然,如果你愿意还是可以像在JAVA中一样使用它.但除非你想在同一行中书写多个语句,否则分号不是必须的.这个代码示例含义非常清楚,想必你已经看明白了它的功能.没错,就是向标准控制台输出一行"Hello, World!".你可以将这些代码保存到一个后缀名为scala的文件中,然后使用scala编译器编译它,编译的结果是一个单独的class文件(译者注:这里原文似乎有错,我编译后事实上生成了两个class文件).你可以像运行普通java文件那样使用java解释器来运行它,不过你需要注意一下classpath.最直接的方法是使用scala命令:

  引用

  scalac hello.scala

  scala HelloWorld

  注意到"hello.scala"文件名没有?Scala并不像Java一样强制你在定义public class时,必须保存在文件名与类名相同的文件中.事实上Scala允许你像C++或Ruby一样,在同一个文件中你想定义多少class都可以.但我们最好还是遵循java的命名规则,因此作为一个具有良好习惯的程序员,我们应该将上面的代码保存为"HelloWorld.scala".

  编辑器:

  在刚开始接触Scala,选择一个正确的编辑器是个关键.就像你在使用java中所了解的那样,IDE非常有用.但作为一门新生的编程语言,Scala目前还没有很好的IDE支持,不过这只是时间问题.在目前,你只有非常有限的选择:

  引用

  Eclipse(有几个不太成熟的Scala插件)

  Emacs

  IntelliJ(只支持基本的语法高亮)

  TextMate

  VIM

  jEdIT

  (译者注:我使用的是UltraEdIT,自己配置一下,能够自动缩进与语法高亮以及编译运行,凑合着用了)

  上面列的是几个主要的选项,更完整的列表可以去Scala安装目录下的misc/scala-tool-support/文件夹下查看.我个人推荐使用jEidt或者TextMate;如果你有冒险精神,可以去尝试Eclipse上的几个插件.Eclipse上的插件具有通常IDE所具有的一些功能(至少Beta版是这样),譬如语义高亮,代码自动完成,etc.但根据我的经验,这些插件都不够稳定以至于难以使用.Scala是一门比Java简洁多的语言,它对IDE的依赖性比java小得多,因此这些都不是本质问题,你可以照样做的很好.

  再来一个例子

  java代码

   

 object HelloWorld2{
  def main(args:Array[String])
= {
  var greeting
=""
  
for(i <- 0 until args.length){
  greeting
+= (args(i) + " ")
  }
  
if(args.length > 0) greeting =greeting.substring(0, greeting.length -1 )
  println(greeting)
  }
  }
  
object HelloWorld2{
  def main(args:Array[String])
= {
  var greeting
=""
  
for(i <- 0 until args.length){
  greeting
+= (args(i) + " ")
  }
  
if(args.length > 0) greeting =greeting.substring(0, greeting.length -1 )
  println(greeting)
  }
  }

    
    (译者注: 可能有读者会奇怪greeting += (args(i) + " ")这段代码为什么要用括号,注意,虽然与习惯不同,但这里的括号是必须的.因为在Scala里面,运算符的优先级由运算符第一个字符代表的运算符的优先级确定.就是说"+="的优先级与"+"的优先级一样,然后..自己想吧:-).BTW,Scala里的运算符也是方法&对象..)

  将它保存到HelloWorld2.scala,并使用如下命令编译运行:

  引用

  scalac HelloWorld2.scala

  scala HelloWorld2 Hello, World!

  这次我们使用了不同的方式,通过命令行向程序传递参数,其运行的结果同样是在控制台输出"Hello, World".这个程序比上一个复杂一些,首先定义了一个String类型的变量greeting,然后遍历一个数组,最后对String进行适当的处理(Scala专家肯定会建议使用Array#deepMkString(String)(类似于Ruby中的Array::join方法),这样确实没错.但我这里主要是为了介绍一些语言上的知识,而不是API的使用).

  首先应该注意的是,这里我们定义了一个main方法.在第一个例子中,我们仅仅继承了Application类,然后把其它的都交给默认构造函数来做.这样很好很简洁,但有两个问题:第一,我们没有办法向程序传递命令行参数;第二,对Scala新手来说,这样看起来有点魔幻.我将在后面的文章中揭开第一个例子中背后的把戏,现在你记住它就是了.

  这个例子中的main方法是不是已经让你联想到了JAVA中的 public static void main?没错,Scala中的main就对应java中的 public static void main.根据这个信息,有经验的程序员就可以通过思考知道更多关于Scala的知识.

  一开始,你可能有这样的结论:Scala中的方法隐含就是public的.这基本正确,Scala中的方法默认为public,这意味着Scala中没有public方法修饰词(private与protected都有定义).更进一步的,你会猜测:Scala中的方法默认为static的.然而,这次你的猜想不完全正确.

  Scala并没有真正意义上的static属性.你越早认识到这一点,你就越容易理解这门语言.作为替代,Scala有专门的语法让你实现与使用sigleton模式(这正是object的含义).我们实际上声明了一个具有实例方法main(译者注:注意,这个main方法并不是static的)的单实例类(singleton class).我将会在以后详细说明这一点,目前你可以认为object就是一个只具有静态方法的类.(译者注:这个描述不甚准确).

[1] [2] 下一页

  • 上一篇文章:

  • 下一篇文章: 没有了
  •  
     最进更新
    普通文章J2SE实现windows读取网卡的物05-11
    普通文章Scala—Java的避难所之main(05-11
    普通文章Spring数据源的灵活配置巧应05-11
    普通文章Spring 与 Log4J 进行动态日05-11
    普通文章Heritrix的多线程ToeThread和05-11
    普通文章应用spring示例开发网站构思05-11
    普通文章Spring 数据源配置与应用05-11
    普通文章Spring中的四种声明式事务的05-11
    普通文章Hibernate+Spring搞定Clob、05-11
    普通文章Hibernate的映射关联关系05-11
     
     推荐文章
    推荐文章Java技术开源搜索引擎04-30
    推荐文章Eclipse中建立自己的JUnit测04-30
    推荐文章Eclipse 3.3上安装jadclipse04-30
    推荐文章spring 编程入门十大问题解答04-30
    推荐文章Java编程中Spring的一些负面04-30
    推荐文章Java应用中Hibernate对多表关04-30
    推荐文章关于hibernate的缓存和CRUD04-30
    推荐文章基于Struts1.2的动态多文件上04-30
    推荐文章演示Struts2实现简单上传代码04-30
    推荐文章J2EE学习笔记--Struts初步认04-30
     
     热点文章
    普通文章J2SE实现windows读取网卡的物05-11
    普通文章Scala—Java的避难所之main(05-11
    普通文章Spring数据源的灵活配置巧应05-11
    普通文章Spring 与 Log4J 进行动态日05-11
    普通文章Heritrix的多线程ToeThread和05-11
    普通文章应用spring示例开发网站构思05-11
    普通文章Spring 数据源配置与应用05-11
    普通文章Spring中的四种声明式事务的05-11
    普通文章Hibernate+Spring搞定Clob、05-11
    普通文章Hibernate的映射关联关系05-11

    | 设为首页 | 加入收藏 | 联系站长 | 广告服务 | 友情链接 | 版权申明 | 网站地图 |

    在线交流 捷凌网安主群:51649627
    Copyright 2007-2008 © 捷凌网安. All rights reserved.
    备案序号:蜀ICP备08001812号