一道面试题的分析

从一道让我失眠的 Promise 面试题开始,深入分析 Promise 实现细节 我们都知道 Js 是单线程都,但是一些高耗时操作就带来了进程阻塞问题。同步模式(Synchronous)和异步模式(Asynchronous)。在异步模式下,创建异步任务主要分为宏任务与微任务两种。ES6 规范中,宏任务(Macrotask) 称为 Task, 微任务(Microtask) 称为 Jobs。宏任务是由宿主(浏览器、Node)发起的,而微任务由 JS 自身发起。宏任务与微任务的几种创建方式👇如何理解 script(整体代码块)是个宏任务呢🤔。 阅读详情

这是我为公司设计的一道Java语言的面试题……嗯……也可以说是两道啦:
写一个Money类,包含金额和币种两个属性,以及加、减两个方法。
附加题:将上题中的Money类实现为一个ValueObject。

先来看本题。

第一个要考察的方面是为两个属性选择正确的数据类型。(不知道什么是属性?……回去换个被程序员更有前途的职业吧。)

对金额而言,最自然的选择是float或者double。但这不是最好的选择。在计算机中,float和double都是有误差的。比如1有可能是1.00000001。所以对金钱这么重要而敏感的东西来说,还是BigDecimal比较好。当然,对于后面的加减运算来说比较麻烦一些。这时还是让人比较怀念C++的运算符重载的。
用int怎么样呢?如果用int来表示以分为单位的金额的话,到也不是不可以。这样精度有保证,而且运算也比较方便。不过如果要表示5厘……就没办法了。

对币种来说,很多人多自然选择了String。不过我以为String不如int,或者short。虽然在Java中,String几乎可以当成基本数据类型使用,但是String毕竟是对象,还是经常要考虑null不null的问题,而且字符串匹配总是不如int(或short)方便和快捷。

到了JDK 1.5的时代,我们又多了一个选择:enum。不过如果是在一个信息系统中,货币种类是可以由用户维护的话,那么enum就不能用了。

除此以外,从OO的角度来说,还有更好的设计吗?有。不过这个问题我留到下一篇讨论。

然后是方法的设计。因为有币种,因此加、减时自然都要考虑同币种的金额才能相加(暂时不考虑汇率换算的问题)。如果币种不相同怎么办?这就是考察的第二个重点: 错误处理。

有不少人使用返回值表示计算的成功与否。比较奇怪的是他们大部分都没有C,C++程序员的经历,不知道是不是学校教育的结果。也有人直接使用System.out.println输出错误信息,这个就更离谱了。

正解应该是使用Exception。偷懒的话,可以使用IllegalArgumentException。如果知道自己定义一个Exception,比如IncompatibleCurrencyException,那如果是我面试,这样的人技术上基本就算过关了。

所以两个方法的原型应该是:

    public void add (Money operand)
    throws IncompatibleCurrencyException
   
    public void subtract (Money operand)
    throws IncopatibleCurrencyExcepiton

如果使用BigDecimal表示金额,那么这里还有一个BigDecimal的加减方法的名称的问题。不过这倒不重要。写程序的时候总有API可以查的。

对于参数是否可以为null,有两种选择。一种是参数为null时,什么也不做。另一种是抛出异常,比如NullPointerException。我认为第二种选择为好。大部分情况下,用null做参数调用add和subtract方法恐怕不是程序员的本意,而是其它程序出错的结果。直接抛出异常有助于及早发现其它部分的错误。

除了属性和加,减方法以外,构造函数以及getter/setter函数虽然没有提到,但作为一个完整的类,还是应该要有的。从健壮性的角度考虑,在构造函数中应该对输入参数有一定判断。比如金额不能为null等。

接下来是附加题。什么是ValueObject。简单说,ValueObject的值(状态)一旦创建以后就不会改变了。所以可以当基本数据类型用。比如Java中的String, BigDecimal, BigInteger都是ValueObject。StringBuffer就不是。

要把Money变成ValueObject,首先不能有setter。构造函数是从类外部设定属性值的唯一途径。
其次,add和subtract方法不能修改this的属性,运算结果要以新的Money对象返回,这样其原型就要变成:

    public Money add (Money operand)
    throws IncompatibleCurrencyException
   
    public Money subtract (Money operand)
    throws IncopatibleCurrencyExcepiton


第三,最好是能重新定义equals和hashCode两个方法。如何重新定义,请看Pearson Education的《Effective Java Programming Language Guide》7,8两章。

遗憾的是,到目前为止能全部达到以上要求的应聘者还没有出现过。更不用说我心中一个非常不现实的奢望了,就是看到一个因聘者首先写下这一行:

public class MoneyTest extends TestCase {

......

海康威视Web3.0插件实战:快速部署摄像头实时预览方案 本文详细介绍了海康威视Web3.0插件的实战应用,包括快速部署摄像头实时预览方案的完整流程。从插件下载安装到摄像头连接配置,再到浏览器兼容性解决方案,帮助开发者和IT人员高效实现网页端监控功能。特别针对预览功能调优和多摄像头管理等高级应用提供了实用技巧。 阅读详情

相关推荐

从零搭建Synopsys EDA环境:Ubuntu系统下的完整安装与避坑指南

本文详细介绍了在Ubuntu系统下从零搭建Synopsys EDA环境的完整流程,包括系统配置、安装文件准备、核心工具安装、License配置及常见问题排查。特别针对数字IC设计场景,提供了VCS、Verdi、Design Compiler等EDA Tools的安装避坑指南和性能优化建议,帮助开发者高效搭建稳定的开发环境。

weixin_33738982的博客 491

Python 类与对象

类与对象的理解与封装特性 面向对象编程语言 - 类: 一个模板, (人类)---是一个抽象的, 没有实体的 - 对象: (eg: 张三, 李四) - 属性: (表示这类东西的特征, 眼睛, 嘴巴, 鼻子) - 方法: (表示这类物体可以做的事情, eg: 吃饭, 睡觉,学习) 1). 定义类:class: 类 from collections import Count...

zcx1203的博客 6万+

基于STM32F334C8T6的四开关Buck-Boost双向DC-DC电源设计与实现(附源码、仿真与计算书)

本文详细介绍了基于STM32F334C8T6的四开关Buck-Boost双向DC-DC电源设计方案。该设计利用STM32的高分辨率定时器(HRTIM)实现精确PWM控制,支持Buck、Boost和Buck-Boost三种工作模式自动切换,具备双向能量流动能力。通过PSIM仿真和Mathcad计算书进行参数优化,实测效率达95.8%,适用于新能源系统和电池管理等场景。

www00的博客 528

我对一道常考面试题的详细分析

移动零题目给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在...

算法channel 269

SAP BSP网页开发入门:从SE80创建到MVC实战(附成品展示)

本文详细介绍了SAP BSP网页开发的入门与实战,从SE80环境搭建到MVC架构实现的全流程。通过具体案例和代码示例,帮助开发者掌握业务服务器页面(BSP)技术,提升SAP Web化转型中的开发效率,适用于需要扩展SAP功能的企业场景。

x1y2z的博客 1万+

告别付费!手把手教你用DataV.GeoAtlas获取全国街道级GeoJSON数据(附完整避坑指南)

本文详细介绍了如何免费使用阿里云DataV.GeoAtlas工具获取全国街道级GeoJSON数据。通过可视化选取、格式转换、数据校验等步骤,提供了一套完整的避坑指南和工作流,帮助前端和可视化开发者高效解决高精度地图数据获取难题,节省成本并提升开发效率。

weixin_29085865的博客 901

史上最难的一道Java面试题 (分析篇)

简书 匠心零度 转载请注明原创出处,谢谢! 无意中了解到如下题目,觉得蛮好。题目如下:public class TestSync2 implements Runnable { int b = 100; synchronized void m1() throws InterruptedException { b = 1000; T

最简单的东西,往往包含了最复杂的实现。 4万+

10分钟训练你的AI歌手:RVC WebUI声音克隆保姆级教程

本文提供了一份详细的RVC WebUI声音克隆保姆级教程,指导用户如何在10分钟内利用Retrieval-based-Voice-Conversion技术训练专属AI歌手。教程涵盖从环境配置、数据准备、模型训练到最终推理应用的全流程,即使是新手也能快速上手,实现高质量的声音克隆与歌曲生成。

weixin_29073241的博客 820

《Wireshark网络分析就这么简单》—从一道面试题开始说起

本节书摘来自异步社区《Wireshark网络分析就这么简单》一书中的从一道面试题开始说起,作者林沛满,更多章节内容可以访问云栖社区“异步社区”公众号查看。 从一道面试题开始说起Wireshark网络分析就这么简单从一道面试题开始说起我每次当面试官,都要伪装成无所不知的大牛。 这当然是无奈的选择——现在每封简历都那么耀眼,不装一下简直镇不住场面。比如尚未毕...

weixin_34122548的博客 2038

从DIY桌面CNC到工业机器人:手把手教你用LinuxCNC搭建自己的第一台数控系统(基于Xenomai实时补丁)

本文详细介绍了如何使用LinuxCNC和Xenomai实时补丁搭建高性价比的数控系统,从硬件选型到实时系统构建,再到HAL硬件抽象层实战和G代码加工,手把手教你打造从DIY桌面CNC到工业机器人的完整解决方案。

weixin_28727975的博客 288

单片机:实现FFT快速傅里叶变换算法(附完整源码)

单片机:实现FFT快速傅里叶变换算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1101

hive一道面试题,用分析函数来求解

今天做了一道hive面试题,我看网上的答案,虽然能实现效果,但是感觉性能不行,代码太长,过于复杂。我用分析函数来做一下 1 题目详情可以参考https://blog.youkuaiyun.com/JENREY/article/details/79871835 2 我大致描述一下题目 原题目:现有这么一批数据,现要求出,每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数 三个字...

zhulinyanyu的博客 663

【QT开发教程】使用Qt进行蓝牙低功耗(BLE)编程

蓝牙低功耗(BLE,Bluetooth Low Energy)技术广泛应用于现代设备中,例如智能手表、健身追踪器和物联网设备。Qt提供了一套完整的Bluetooth模块,使开发者可以轻松地在应用程序中实现BLE通信功能。本文将介绍如何在Qt中进行BLE编程,包括基本概念、使用方法以及一些实际的示例。

科技改变人类,技术成就未来 2869

从一道面试题分析Linux进程+IO缓冲区机制

从一道面试题分析Linux进程+IO缓冲区机制

勤能补拙 4091

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

一道java面试题分析及思考

转载请注明原创出处,谢谢! 无意中了解到如下面试题目,觉得蛮好,但是没有分析,所以自己拿来分析了下,以及自己的一些思考理解。 题目如下: public class TestSync2 implements Runnable { int b = 100; synchronized void m1() throws InterruptedException { b =...

weixin_33849942的博客 110

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

《大咖讲Wireshark网络分析》—从一道面试题开始说起

本节书摘来自异步社区《大咖讲Wireshark网络分析》一书中的从一道面试题开始说起,作者林沛满,更多章节内容可以访问云栖社区“异步社区”公众号查看。 从一道面试题开始说起大咖讲Wireshark网络分析我每次当面试官,都要伪装成无所不知的大牛。 这当然是无奈的选择——现在每封简历都那么耀眼,不装一下简直镇不住场面。比如尚未毕业的本科生,早就拿下CCIE...

weixin_33884611的博客 775

java思维题_一道Java面试题分析及思考

无意中了解到如下面试题目,觉得蛮好,但是没有分析,所以自己拿来分析了下,以及自己的一些思考理解。题目如下:public class TestSync2 implements Runnable {int b = 100;synchronized void m1() throws InterruptedException {b = 1000;Thread.sleep(500); //6System.o...

weixin_42347778的博客 238

一道JS面试题及分析

前几天,一个前端微信群里有这么一道题: var y=1; if( function f(){}){ y += typeof f; } console.log(y); 第一反应呢,这个题答案应该式 1function ,可是结果出人意料,是 1undefined。 查阅资料后大致了解了原因。 这里涉及到一个知识点,就是函数声明和函数表达式。 (i)函数声明和函数表达式 在J

纪风夜影 610

抓包分析访问指定ip_网络分析的艺术——从一道面试题开始聊

从一道面试题开始聊起有这样一道网络工程师面试题,问题为:两台电脑A和B的网络配置如下(见图一和图二),电脑B的子网掩码本应该是255.255.255.0,被不小心配成255.255.255.224。它们还能正常通信吗?电脑A:图一电脑B:图二我们可以得到很多形形色色的答案:张三:“A和B能相互通信,因为它们可以通过ARP协议广播获得对方的MAC地址。”李四:“A和B不能相互通信,因为他们...

weixin_28863429的博客 270

史上最难java_史上最难的一道 Java 面试题 (分析篇)

原标题:史上最难的一道 Java 面试题 (分析篇)来自:匠心零度(微信号:jiangxinlingdu)链接:http://blog.youkuaiyun.com/lirenzuo/article/details/78253481无意中了解到如下题目,觉得蛮好。题目如下:public class TestSync2 implements Runnable {int b = 100;synchronized ...

weixin_39712969的博客 132

一道算法面试题的分析

面试题描述:一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能行有多少种?网上已经有很多解法了,不过这里从一般的角度分析。抽象出来的数学描述就是:从M个数中取出N个数,使得和正好等于给定的值,求所有的取法。C++实现://从M个数中取出N个数,使得和正好等于total,求所有的取法 int result[1024];//结果记录 int count = 0;//结果计数 int total = 90;//指定的和 int M = 11; int N = 10; //从m个数中取出n个

visualwind 1040

从一道面试题分析javascript闭包

据说是一不注意就会做错的五道javascript面试题之一,我们来看看这道题长什么样 function Container( properties ) { var objthis = this; for ( var i in properties ) { (function(){ var t = prop...

weixin_30496431的博客 125

一道面试题引发的逃逸分析

面试题 在Java中,通过new创建的对象一定分配在堆上吗? 解析 是不是很想回答:是的!然后看到题中的“一定”二字犹豫了?这是一个开放性的面试题,你可以回答一定是的,但是要有个前提,这个前提先不揭秘,下面我们先来看几个概念性的东西:逃逸分析、栈上分配和TLAB(Thread Local Allocation Buffer)。 1. 逃逸分析是什么 逃逸分析(...

串一串爪娃子 848

一道让我半夜失眠的 Promise 面试题深入分析

点击上方“蓝色字体”,选择“设为星标”做积极向上的前端人!作者ITEM原文链接:https://juejin.cn/post/6945319439772434469先把罪魁祸首挂在这里...

画漫画的程序员∙苏南 396

一道亚马逊算法面试题的情景分析

阅读博客的朋友可以观看视频: http://study.163.com/course/courseMain.htm?courseId=1002942008我们聚焦于一道亚马逊的算法面试题,通过分析该题,复盘它的解题情景,我们可以初步体会到算法面试的应对步骤,并从中窥探到,成功的算法面试,其流程应该怎么走。

tyler_download的专栏 4720
上一篇: 由一个失败的项目看离岸外包项目中的风险。
下一篇: 一道面试题的分析(续)
BirdGu
博客等级 码龄24年 11粉丝 11原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值