zoukankan      html  css  js  c++  java
  • StackOverflow 第四周周报及19年就业情况分析

    这是 Stack Overflow 第四周周报,两篇 Java、两篇 Python。公众号「渡码」为日更,欢迎关注。另外,我搜集了今年的就业数据,对招聘情况和岗位情况做了简单总结,想了解的朋友点这里

    DAY1. 枚举对象 == 和 equals 区别

    我们在比较枚举常量时可以使用 == 运算符或者 equals 方法,如:

    public class EnumEquals {
    
        public enum FRUITS  {
            /** 苹果 */
            APPLE,
            /** 橙子 */
            ORANGE
        }public static void equalApple(FRUITS fruit) {
            if (fruit == FRUITS.APPLE) {
                System.out.println("equals");
            }
            if (fruit.equals(FRUITS.APPLE)) {
                System.out.println("equals");
            }
        }
    }

    先考虑第一个问题:为什么可以用 == 判断枚举常量相等?

    我们都知道判断对象的相等应该用 equals 方法,== 只是判断对象的引用是否相等,枚举常量能够使用 == 判断相等是因为枚举常量除了定义时初始化的对象外,没有其他实例。例如:常量 APPLE 在定义时已经初始化,并且运行时不会再有其他的 APPLE 枚举常量。根据 JLS 文档,Java 通过以下四点保证枚举常量不存在定义之外的实例

    • 试图显式实例化枚举类型是编译时错误,例如:new FRUITS()
    • Enum 类中的 clone 方法确保永远不能克隆Enum常量,看看 clone 方法可以看到直接抛出 CloneNotSupportedException 异常
    • 序列化机制的特殊处理确保不会因为反序列化而创建重复的实例
    • 禁止枚举类型的反射实例化

    因为枚举常量只有一个实例,因此可以直接用 == 判断枚举实例的相等。如果我们看下 equals 源码就可以发现它也是用 == 进行判断,所以我们考虑第二个问题:使用 == 和 equals 的区别是什么?

    • == 不会抛出 NullPointerException 异常, 而 equals 会
    • == 的类型不匹配在编译时检查,而 equals 不检查
    public class EnumEquals {
    
        public enum FRUITS  {
            /** 苹果 */
            APPLE,
            /** 橙子 */
            ORANGE
        }
    
        public enum SIZE {
            /***/
            SMALL,
            /***/
            MIDDLE,
            /***/
            LARGE
        }
    
        public static void main(String[] args) {
            FRUITS fruit = FRUITS.APPLE;
            fruit == SIZE.SMALL;
        }
    }

    因此使用 == 相比 equals 有以下优势:

    • 更快
    • 运行时更安全
    • 编译时更安全

    参考:

    https://stackoverflow.com/questions/1750435/comparing-java-enum-members-or-equals

    https://docs.oracle.com/javase/specs/jls/se9/html/jls-8.html#jls-8.9

    DAY2. 用 Python 复制文件

    我们都知道 Python 库非常强大,通常我们想实现一个功能基本都找到现成的库。今天我们就介绍 Python 标准库中的一个模块 —— shutil ,该模块中定义了文件复制的方法。如:复制一个文件,直接调一个函数即可

    src = '1.txt'
    dst = '2.txt'
    
    shutil.copyfile(src, dst)

    除了该函数, shutil 模块还定义了其他的函数提供文件复制的功能,但是细节略有不同,对比如下:

    其中 copy2 复制的比较全面,估计性能也是比较低的。下面简单举两个例子对比一下不同函数的区别。

    1. 目的路径是否是目录,copyfile vs copy2

    src = 'test.rar'
    dst = 'D:\'
    
    shutil.copyfile(src, dst)
    shutil.copy2(src, dst)

    2. 是否能复制 meta 数据,copyfile vs copy2

    src = 'test.rar'
    dst = 'test1.rar'
    
    shutil.copyfile(src, dst)
    shutil.copy2(src, dst)

    查看文件的 meta 信息,copyfile 复制的文件的更新时间是最新的, 而 copy2 复制的文件更新时间与源文件一样。

    这里只举这两个例子,如对其他函数感兴趣可自行尝试。另外,shutil 模块应该还有其他更方便的函数可以供我们使用。总之使用 Python 开发效率还是挺高的,掌握 Python 确实能提高工作效率。

    参考:

    https://stackoverflow.com/questions/123198/how-do-i-copy-a-file-in-python

    DAY3. 什么是 Java Bean

    从学 Java web 开发起,我们就知道有 Java Bean 这个东西。但对于我来说,因为我毕业后一直做大数据,讲真我确实不知道 Java Bean 的正式定义。下面我们一起看看符合什么要求才叫 Java Bean :
    • 所有的属性是 private,提供 getter 和 setter 设置属性
    • 有一个 public 无参构造函数
    • 实现 Serializable 接口

    Java Bean 其实是一种规范。对于我们学知识来说,往往想问为什么 Java Bean 定义这样的规范。对照上面三点,我的思考是这样的:

    • getter/setter 方法为了对外暴露属性的读写接口,方便框架调用。同时,属性用 private 修饰可以提高安全性
    • 之前的文章看过 Hadoop 框架反射的例子, public 无参构造可以很方便框架通过反射创建类实例
    • 由于 web 框架通常需要数据传输,因此需要对象具有序列化与反序列化的能力

    我们今天这篇文章比较简短,只是简单介绍了一下 Java Bean 规范的定义,并且谈了谈我自己的一些思考。

    参考:

    https://stackoverflow.com/questions/3295496/what-is-a-javabean-exactly

    DAY3. Python 中实现 switch 语句

     我们都知道 Python 原生语法中不支持 switch 语句。当然 Python 这么灵活的语法,我们自己实现一个也比较容易。代码如下:

    def f(x):
      return {
          'a': 1,
          'b': 2,
      }[x]

    这样实现稍微有些不完备,没有默认值,且如果参数不在字典中会报错。我们更新一版如下:

    def f(x):
      return {
          'a': 1,
          'b': 2
      }.get(x, 9)

    这样实现看起来比较理想了,我们还可以用 Lambda 表达式实现复杂计算,例如:

    def f3(x):
      return {
          'a': lambda x: x * 5,
          'b': lambda x: x + 7,
          'c': lambda x: x - 2
      }.get(x, lambda x: x)

    用 Python 实现 switch 语句还是非常方便的。
    猜测 Python 原生之所以不支持 switch 语法是因为 Python 语言本身已经很灵活了,不需要额外提供 switch 语句增加语言本身的臃肿。真是应了那句话,人生苦短,我用 Python

    以上便是 Stack Overflow 的第四周周报,希望对你有用,后续会继续更新,如果想看日更内容欢迎关注公众号。

    公众号「渡码」,回复 就业 查看各平台完整的分析报告,分享更多高质量内容

  • 相关阅读:
    Postman的使用和测试
    Django报错 django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
    MySQL 修改字段类型或长度
    mysql导入导出sql文件
    Django 无法同步数据库model相应字段问题
    Django objects.all()、objects.get()与objects.filter()之间的区别介绍
    inconsistent use of tabs and spaces in indentation
    JavaScript 计时器
    JavaScript--编程题
    JavaScript--Array 数组对象
  • 原文地址:https://www.cnblogs.com/duma/p/11595248.html
Copyright © 2011-2022 走看看