关于Java的一些脑洞

最近, 在做软件构造课程的一些实验时, 对Java语言的设计产生了一些想法. 
在Java中, 继承是被广泛使用的一种特性. <<Thinking in Java>>一书中认为满足"is a"关系的两种事物都可以用继承关系来联系. 但在实际使用中, 很少有实体类的父类几乎都是Object或abstract class, 很少有实体类的父类是另一个实体类. 这是为什么呢? 仔细想想, 实体类的父类是另一个实体类的话, 这本身就很奇怪. 因为这样的话, 你用instanceof判断它是A, 并且期望他有这样的行为, 但是他其实是A的子类B的一个实例, 因此细节上上表现出来并不是一个标准的A(如果是的话, B类就没有存在的必要了, 这就更奇怪了). 而如果想要以抽象类为父类的话, 完全可以把抽象类实现为实体类, 而把关系换成组合模式, 这难道不是更棒吗, 因此, 我认为, 继承完全是可以被去除的一种语言特性. 
那么, 如何把继承从Java中去除呢? 首先, 有一点是肯定的, 那就是接口的使用肯定要变得更加广泛. 这时, 我们就应该改变一下观念. 不应继续吧接口看成实现多继承的一种手段. 接口不是妥协的产物, 类之间的交互本身就应通过接口来约定. 然后, 既然没有了继承, 那抽象类的存在也就没有必要了. 但是抽象类本来就是抽象的, 换成实体类的话, 怎么实现他本来就没有实现的功能呢? 我们可以让它不继承接口, 将内部暴露出来, 成为实体类的一个组件. 这样的话, 之前通过继承关系实现的功能, 现在都能替代了. 
然后就是对函数对象的抽象, 类似C#中delegate的功能. 这并不是说将各种Listener替代为类似delegate的东西, 而是要体现出函数的地位. 而且Java中对lambda表达式的引入有些太突兀了. 为什么带有两个方法的接口与带有一个方法的接口有如此大的差别呢? 实际上, 他们没有本质的差别. 所以, 我觉得, 应该将lambda表达式用在别的方法, 使用lambda表达式的话, 可以声明一个函数, 然后该函数可以直接使用, 也可用来实现接口, 如下: 
interface Interface{
  void func();
}
public class Class impl Interface{
  func = ()->{
    var temp = ()->{
      System.out.println("Hello world");
    };
    temp();
  }
}
如果有这样的形式, 相信在代码的编写时会方便得多. 当然, 这好像也对JVM带来很大的挑战. 

猜你喜欢

转载自blog.csdn.net/chen1144154299/article/details/80719088