Code Review时学到的技巧之isAssignableFrom
🍊 Java学习:Java从入门到精通总结
🍊 深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想
🍊 绝对不一样的职场干货:大厂最佳实践经验指南
📆 最近更新:2023年4月1日
🍊 个人简介:通信工程本硕 for NJU💪、Java程序员🌕。做过科研paper,发过专利,优秀的程序员不应该只是CRUD
🍊 点赞 👍 收藏 ⭐留言 📝 都是我最大的动力!
文章目录
- Code Review
- isAssignableFrom
- 和`instanceof`的区别
Code Review
Code Review(代码审查)是指在代码合并或发布之前,由其他开发人员对代码进行检查和评估的过程,以保证代码的质量、风格、安全性和可维护性。Code Review有以下几个好处:
- 可以及时发现和修复代码中的错误、漏洞和不良实践,提高代码的健壮性和性能。
- 可以统一团队的代码规范和开发流程,提高代码的可读性和一致性。
- 可以促进团队的知识共享和学习,让开发人员互相交流和借鉴优秀的代码和设计。
- 可以增强团队的协作能力和信任感,让开发人员更加关注代码的质量而不是数量。
公司里面常用的Code Review机制主要包括以下几个方面:
- 每次提交代码之前都必须经过至少一个其他开发人员的审查才能合并或发布。
- 把Code Review变成一种开发文化而不仅仅是一种制度,即让开发人员从内心认识到Code Review的重要性和价值,并认真执行和配合。
- 选用合适的工具辅助做Code Review,比如Github、Gitlab、Azure DevOps等,可以方便地查看代码变更、添加评论、追踪状态等。
- 配合自动化测试、静态代码检查等工具做预提交检查,可以减少人为的错误和遗漏,让人类可以专注于更难搞的问题。
- 保持Code Review的轻量级和快速反馈,即尽量减少每次提交的代码量,及时完成审查和修改,避免拖延和堆积。
- 在Code Review中保持尊重和友好的态度,即审查者要给出具体和建设性的意见,被审查者要虚心接受和改进。
下面就分享一下我在上周CR的时候学到的一个技巧。
isAssignableFrom
这个方法用于判断一个类或接口是否是另一个类或接口的子类或子接口,或者是否相同。如果是,返回true,否则返回false。例如:
public class ClassDemo {public static void main(String[] args) {try {ClassDemo cls = new ClassDemo();Class c = cls.getClass();// class object associated with BaseClassClass subClass = SubClass.class;// checks whether BaseClass is assignable from ClassDemoboolean retval = subClass.isAssignableFrom(c);System.out.println("Return Value = " + retval);// checks whether ClassDemo is assignable from BaseClassretval = c.isAssignableFrom(subClass);System.out.println("Return Value = " + retval);} catch(Exception e) {System.out.println(e.toString());}}
}
// base class
class SubClass extends ClassDemo {public SubClass() {// no argument constructor}
}
输出结果是:
Return Value = false
Return Value = true
这是因为ClassDemo
是SubClass
的父类,所以SubClass
可以赋值给ClassDemo
,但反过来不行。
和instanceof
的区别
这个方法instanceof
有一些区别:
instanceof
是一个二元操作符,用于判断一个对象是否是一个类型的实例或子类。isAssignableFrom
是一个方法,用于判断一个类或接口是否是另一个类或接口的子类或子接口,或者是否相同。instanceof
只能用于引用类型,不能用于基本类型。isAssignableFrom
可以用于任何类对象。instanceof
在编译时需要知道右边的类型。isAssignableFrom
可以在运行时动态地判断类型。instanceof
对null
值返回false
。isAssignableFrom
对null
值抛出异常。
实验过程如下:
int i = 10;
Integer j = 10;
System.out.println(i instanceof Integer); // 编译错误,基本类型不能用instanceof
System.out.println(j instanceof Integer); // true
System.out.println(Integer.class.isAssignableFrom(int.class)); // false
System.out.println(Integer.class.isAssignableFrom(Integer.class)); // true
System.out.println(null instanceof Integer); // false
System.out.println(Integer.class.isAssignableFrom(null)); // 运行时错误,空指针异常
这个方法通常用于反射或动态类型检查的场景。例如:
如果你想判断一个类是否实现了某个接口,可以用isAssignableFrom
方法。比如:
public interface Shape { }
public class Triangle implements Shape { }
public class IsoscelesTriangle extends Triangle { }System.out.println(Shape.class.isAssignableFrom(Triangle.class)); // true
System.out.println(Shape.class.isAssignableFrom(IsoscelesTriangle.class)); // true
System.out.println(Triangle.class.isAssignableFrom(Shape.class)); // false
如果你想判断一个类是否是另一个类的父类或祖先类,你也可以用isAssignableFrom
方法。比如:
public class Animal { }
public class Dog extends Animal { }
public class Poodle extends Dog { }System.out.println(Animal.class.isAssignableFrom(Dog.class)); // true
System.out.println(Animal.class.isAssignableFrom(Poodle.class)); // true
System.out.println(Dog.class.isAssignableFrom(Animal.class)); // false
如果你想在运行时动态地加载一个类,并判断它是否和另一个类兼容,你也可以用isAssignableFrom方法。比如:
Class<?> cls = Class.forName("com.example.MyClass");
if (SomeInterface.class.isAssignableFrom(cls)) {SomeInterface obj = (SomeInterface) cls.newInstance();obj.doSomething();
}