[编写高质量代码:改善java程序的151个建议]建议34:构造函数尽量简化
2013-12-09 08:51
766 查看
通过这个例子,可以分析一下 父类 子类的变量的初始化过程:
public abstract class Server {
public final static int DEFAULT_PORT = 40000;
public Server(){
int port = getPort();
System.out.print(port);
}
protected abstract int getPort();
}
public class SimpleServer extends Server {
private int port = 100;
public SimpleServer(int port) {
this.port = port;
}
protected int getPort() {
return Math.random() > 0.5 ? port : DEFAULT_PORT;
}
}
public class Client {
public static void main(String[] args) {
Server s = new SimpleServer(1000);
}
}
//0 或 40000
原因在于整个初始化的过程。
1. 子类接受参数1000
2. 调用子类构造函数,默认通过super()调用父类构造函数
3.调用父类,先初始化静态变量,DEFAULT_PORT = 40000;
4.调用父类构造函数中,调用getPort()方法,然后实际调用的是子类的getPort()方法
5.根据随机数,获取port值,此时port尚未赋值,是0或者DEFAULT_PORT值为40000
6.打印0 或40000
7.子类的变量初始化,port=100
8.构造函数中域变量被赋值为1000.
---修改
public abstract class Server {
public final static int DEFAULT_PORT = 40000;
// public Server(){
// // int port = getPort();
// // System.out.print(port);
// }
protected abstract int getPort();
protected abstract int start();
}
public class SimpleServer extends Server {
private int port = 100;
public SimpleServer(int port) {
this.port = port;
}
protected int getPort() {
return Math.random() > 0.5 ? port : DEFAULT_PORT;
}
protected int start() {
int port = getPort();
System.out.print(port);
return port;
}
}
public class Client {
public static void main(String[] args) {
Server s = new SimpleServer(1000);
s.start();
}
}
//1000 or 40000
建议:构造函数要尽量简化,对于这种涉及到父类子类牵扯到运行时的逻辑尽量不要这么使用。
public abstract class Server {
public final static int DEFAULT_PORT = 40000;
public Server(){
int port = getPort();
System.out.print(port);
}
protected abstract int getPort();
}
public class SimpleServer extends Server {
private int port = 100;
public SimpleServer(int port) {
this.port = port;
}
protected int getPort() {
return Math.random() > 0.5 ? port : DEFAULT_PORT;
}
}
public class Client {
public static void main(String[] args) {
Server s = new SimpleServer(1000);
}
}
//0 或 40000
原因在于整个初始化的过程。
1. 子类接受参数1000
2. 调用子类构造函数,默认通过super()调用父类构造函数
3.调用父类,先初始化静态变量,DEFAULT_PORT = 40000;
4.调用父类构造函数中,调用getPort()方法,然后实际调用的是子类的getPort()方法
5.根据随机数,获取port值,此时port尚未赋值,是0或者DEFAULT_PORT值为40000
6.打印0 或40000
7.子类的变量初始化,port=100
8.构造函数中域变量被赋值为1000.
---修改
public abstract class Server {
public final static int DEFAULT_PORT = 40000;
// public Server(){
// // int port = getPort();
// // System.out.print(port);
// }
protected abstract int getPort();
protected abstract int start();
}
public class SimpleServer extends Server {
private int port = 100;
public SimpleServer(int port) {
this.port = port;
}
protected int getPort() {
return Math.random() > 0.5 ? port : DEFAULT_PORT;
}
protected int start() {
int port = getPort();
System.out.print(port);
return port;
}
}
public class Client {
public static void main(String[] args) {
Server s = new SimpleServer(1000);
s.start();
}
}
//1000 or 40000
建议:构造函数要尽量简化,对于这种涉及到父类子类牵扯到运行时的逻辑尽量不要这么使用。
相关文章推荐
- [编写高质量代码:改善java程序的151个建议]建议34:构造函数尽量简化
- [编写高质量代码:改善java程序的151个建议]建议84 使用构造函数协助描述枚举项
- [编写高质量代码:改善java程序的151个建议]建议67 不同的列表选择不同的遍历方法
- 编写高质量代码:改善Java程序的151个建议(第8章:多线程和并发___建议126~128)
- 编写高质量代码:改善Java程序的151个建议pdf
- 编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理
- 编写高质量代码:改善Java程序的151个建议
- [编写高质量代码:改善java程序的151个建议]摘记一(P1~P60)
- [编写高质量代码:改善java程序的151个建议]建议52 推荐使用String直接量赋值
- [编写高质量代码:改善java程序的151个建议]建议70 子列表只是原列表的一个视图
- [编写高质量代码:改善java程序的151个建议]建议91 枚举和注解结合使用威力更大
- [编写高质量代码:改善java程序的151个建议]建议68 频繁插入和删除时使用LinkedList
- 读书笔记--编写高质量代码:改善java程序的151个建议(三)重写equals六大原则
- 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议60~64)
- 编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议11~15)