[编写高质量代码:改善java程序的151个建议]建议34:构造函数尽量简化

news/2023/9/28 14:19:47

通过这个例子,可以分析一下 父类 子类的变量的初始化过程:

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
 
建议:构造函数要尽量简化,对于这种涉及到父类子类牵扯到运行时的逻辑尽量不要这么使用。

转载于:https://www.cnblogs.com/akingseu/p/3464624.html


https://dhexx.cn/news/show-19119.html

相关文章

php程序员个人简历模板下载_编写PHP简历要遵循的四大原则

原则一 : 简历名字要得体不知道你有没有用过这样的名称 个人简历.doc, xxx 个人简历.doc, xxx,...HR 看一下就一脸懵逼, 还要点开看看才能知道你要干嘛。另外, 推荐使用 PDF。 所以在这里推荐一种写法:姓名_PHP 开发_5…

在计算机网络中 用户可随意共享,网管,请别随意关闭默认共享

不知道在什么时候,关闭Windows系统中的C$、D$、IPC$等默认共享成为了最基本的安全防范措施,惊弓之鸟们纷纷响应号召,向默认共享宣战。然而存在是有理由的,默认共享的存在同样如此。你可知道盲目地关闭这些默认共享会带来某些非常严…

传说中补作业的自我介绍

由于我们这个团队的组长非常的坑爹,不知道留了作业这种东西,所以在被扣分扣到头大之后赶紧来补上。 我们这个团队叫WWW,名字来源于我们可爱的组员们,王泓洋(W1)、王冬(W2)、王熹(W3)(排序不分先后)。 我们的…

springboot 采用redis实现 session共享

首先将springboot集成redis的环境先搭建好 可参考文档:https://blog.csdn.net/qq_41712271/article/details/103665054 <dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId> <…

计算机桌面怎么设置在开始菜单,Win10怎么设置显示桌面而不是开始菜单 登录时转到桌面而非开始屏幕...

在win10系统中不仅融入各种功能&#xff0c;在操作与布局上有很大的突出改变&#xff0c;值得关注的是win10已经恢复那熟悉的开始菜单&#xff0c;而win10开始菜单主要是由经典菜单区、windows快捷区和metro应用区&#xff0c;可见“开始”菜单设计更加人性化&#xff0c;但有用…

读过的一些书

书与互联网资料不同&#xff0c;书更能让你深入地去了解一种技术...下面是我看过的一些书[caption id"attachment_362" align"alignnone" width"306" caption"日本作家写的一本时间管理的书籍"][/caption] [caption id"attachmen…

html给img添加阴影,WPS表格中如何给插入的图片添加阴影效果 看完你就知道了

在制作WPS工作表中&#xff0c;我们经常会插入图片进入工作表&#xff0c;为了使插入的图片更加美观&#xff0c;我们可以给插入的图片添加阴影效果。其具体操作步骤如下&#xff1a;工具/材料WPS办公软件操作方法01在桌面上双击WPS表格的快捷图标&#xff0c;打开WPS表格这款软…

基于l298n的步进电机控制_通过pwm方式控制电机-L298N-Java版本

我们知道树莓派提供一个硬件pwm引脚&#xff0c;可以通过脉冲宽度调制进行控制电机的速度。实际上在精度要求不是非常高的情况下&#xff0c;普通引脚也可以通过软件模拟来控制电机&#xff0c;实现pwm一样的功能。一.准备树莓派4b电机驱动L298N直流电机电源盒(4节1.5v电池)电源…

初识Opserver,StackExchange的监控解决方案

Opserver是闻名遐迩的网站Stack Overflow的开源监控解决方案&#xff0c;由Stack Exchange发布。它基于.NET框架构建&#xff0c;这在监控工具领域有些与众不同。 旨在为每个受监控系统的健康状况提供一个快速的总体视图&#xff0c;还允许用户使用下钻方法进行深入挖掘。Nick …

html表格导出样式丢失,前端将table导出为excel,可设置样式(笔记)

注意事项需引入以下4项!!!import XLSX from xlsximport FileSaver from file-saverimport xlsxStyle from xlsx-style;import XSU from ./xlsxStyle.utils;// XLSX 、FileSaver 、xlsxStyle 都可以直接npm下载(引入1、2、3可npm下载)引入1&#xff1a;import XLSX from xlsx引入…