第45条:将局部变量的作用域最小化

将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性。

这一条看字面意思应该已经非常明了了,就是教我们在申明局部变量的时候注意其作用域,将其作用域最小化:

  • 比如有些判断的变量在if语句里面完成就好
  • 还有循环里面for优于while,因为for往往不需要其他的额外局部变量
  • 另一种就是使方法小而集中

第46条:for-each循环优先于传统的for循环

利用for-each循环不会有性能损失,甚至用于数组也是一样的

1
2
3
4
5
6
7
8
9
10
11
Collection<Integer> c=Arrays.asList(1,2,3);
//普通的for循环
for(Iterator iter=c.iterator();iter.hasNext())
{
doSomething(iter.next());
}
//使用for-each的版本
for(Integer v:c)
{
doSomething(v);
}

还有一点是如果你使用普通的for,那么它的next会走光所有的元素,也就无法再利用。

Read More

本章主要讨论方法设计的几个方面:

  • 如何处理参数和返回值
  • 如何设计方法签名
  • 如何为方法编写文档

第38条:检查参数的有效性

这条就是教我们对于公有方法,最好在方法体上的开头处加上参数检查,并且在文档中清楚地指出这些限制,比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 求模
* @param m
* @return
* @throws ArithmeticException 如何m小于等于0时抛出异常
*/

public BigInteger mod(BigInteger m) throws ArithmeticException
{

if(m.signum()<=0)
throw new ArithmeticException("Moduls <= 0:"+m);

//do something
return ...
}

Read More

麻辣鱼简直就是大餐啊,油而不腻,并且鱼的腥味直接被重口味的油辣给冲掉了-_-,可惜我做的还不到火候。
又是一个周五,所以要给自己一个大餐,哈哈!

食材

  • 鱼:最好是黑鱼,并且要切片(自己切麻烦,可以在买菜的时候直接叫师傅给切了)
  • 油、料酒~~~~
  • 生姜、大蒜:适量,再来一点点葱
  • 大量大量的辣椒

Read More

先谈Java中的枚举

Scala的枚举之前,我们先来讲讲关于Java里面的枚举(相信对于广大程序猿来说都是很熟悉):

  • 使用enum关键词定义

    1
    public enum WeekDay{...}
  • 无法再继承其他类或者枚举(但是可以实现接口),因为它默认继承了java.lang.Enum

  • 无法在外部调用枚举的构造函数(因为枚举的构造函数都是私有的,只有内部才能调用)
  • 枚举其实是一组int常量(当初它就是因为使用int常量的需求很大才又了枚举),它还可以在swtich中很方便的使用
  • 每个枚举变量还可以重写枚举类或者实现接口中的方法(这个蛮好用)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public enum WeekDay{
    Mon{
    @Override
    public String say(){return "monday";}
    },
    Tue{
    @Override
    public String say(){return "tuesday";}
    };

    public String say(){return "";}
    }
  • …(我也不知道了-_-)

再看Scala中的枚举

你会发现,上面说的一切在Scala中其实并没有甚么卵用-_-,因为在Scala中压根就么有enum这个关键词,但是当初发明Scala大神兼Java的创始人并没有落下枚举。

Read More

这两天微软的分布式系统开发框架rDSN开源出来了,必须要Akka压压惊,当然在Spark中大量的使用了AKKA是主要原因^_^

AKKA介绍

Akka是一个基于JVM的用于构建高并发、分布式、弹性的消息驱动系统,它有以下5个特点:

  1. 并发和分布式
  2. 弹性设计
  3. 高性能
  4. 去中心化
  5. 高扩展性

可以基于AKKA构建高并发的web框架,也可以构建分布式系统(Spark

AKKA的引用

如果你是Maven用户,你可以这么添加依赖

1
2
3
4
5
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor_2.10</artifactId>
<version>2.3.11</version>
</dependency>

如果你是SBT用户,你的build.sbt可以这么写

1
name := "My Project"
version := "1.0"
scalaVersion := "2.10.4"
libraryDependencies +=
  "com.typesafe.akka" %% "akka-actor" % "2.3.11"

它还提供了好多其他的其他用法,但是由于天朝连国外网速也是在是太慢了,我直接去http://akka.io/downloads/将压缩包给download下来,然后将已编译的jar添加到IDEA中,简单、粗暴、高效。

Read More

位域法

如果一个枚举类型的元素主要用于在集合中,一般就使用int枚举类型,将2的不同倍数赋予每个常量。
这种表示方法让你用OR位运算将几个常量合并到一个集合中,称作位域。

Spark源码中进入SparkSubmit类中就可以看到

1
2
3
4
5
6
7
8
9
10
11
// Cluster managers
private val YARN = 1
private val STANDALONE = 2
private val MESOS = 4
private val LOCAL = 8
private val ALL_CLUSTER_MGRS = YARN | STANDALONE | MESOS | LOCAL

// Deploy modes
private val CLIENT = 1
private val CLUSTER = 2
private val ALL_DEPLOY_MODES = CLIENT | CLUSTER

将集群类型和部署模式使用位域法来存储。

在《Effective Java》第32条中提到,但是都不推荐。。Spark都使用了,难道这种结构不好嘛??^_^

Read More

用Mac一个多月来,已经慢慢习惯,Mac下的软件都比较精致,虽然其数量远不及Windows,但是日常使用的都已经有了。

office2011 for mac破解版

下载地址http://www.macx.cn/thread-2082485-1-1.html
穷人Mac使用者首选,可以和Windows上的office无缝对接,如果你安装完之后发现word很模糊的话 请将office升级到最新版。
里面还有一个很强的功能就是Micosoft Connection,用这个软件可以直接在mac端远程到windows端,方便的很。

这个是2016版本 亲测可用

chmox

下载地址http://chmox.sourceforge.net/
chmox可以在mac下查看chm帮助文档,毕竟chm格式的文档很多啊^_^,chmox真实良心产品

Read More

之前在看网上使用Eclipse搭建Spark的源码环境各种复杂,所以我只会spark source code下载下来,然后Import到Eclipse中,各种报错,各种包没有,还好我只是看看源码而已,不运行它报错也无所谓啦,人懒没办法..

但是现在想深入得学习一下Spark的源码环,就不得不搭建完整地环境,所以使用号称开发神器的IDEA来搭建Spark的源码环境,果然很方便^_^

准备工作

  • JDK1.7+
  • Scala2.10.4(最好用这个版本,不然用最新版可能导致Spark出各种错误,点这里下载)
  • IntelliJ IDEA 14 Community Edition(记得下载时选择社区版,它是免费的)
  • Mac OS X 10.10.2 (用其他环境也可以,但是别用windows啊)

从Github上clone源码

打开Idea,在欢迎界面别动!!!

点击Check out from version Control->Git

Read More

第30条:用枚举代替int常量

在编程语言中还没有引入枚举类型之前,表示枚举类型的常用模式就是声明一组具名的int常量

1
2
3
public static final int APPLE_FUJI			=0;
public static final int APPLE_PIPPIN =1;
public static final int APPLE_GRANNY_SMITH =2;

但是它又诸多的缺点:

  • 在类型安全性和使用方便性方面没有任何帮助。
  • 如果关联的int放生了变化,客户端必须得重新编译。
  • 打印调试的时候只能打印数字

上述int常量如何使用枚举类实现

1
public enum APPLE{FUJI,PIPPIN,GRANNY_SMITH};

除了编码简单之外,枚举的特点还有:

  • 枚举是类型安全的(所有可以作为单例的泛型化来使用)。
  • 可以增加或者重新排列枚举类型中的常量,而无需重新编译它的客户端代码。
  • 可以通过toString方法来打印可视的字符串。

Read More