选择排序法
来源:1-1 最简单的排序算法:选择排序法
weixin_宝慕林5160547
2021-11-12 06:12:21
bobo老师,想问一下,刚看到选择排序法。选择排序法中为什么要私有化构造函数?刚学习了Java基础,可能学的还不是很扎实,希望老师不要怪我问的问题太白痴。。
1回答
liuyubobobo
2021-11-12
这个问题很好:)
首先,你可以选择公有化构造化函数,私有化构造函数不是必须。在这个课程中,我们对选择排序算法类(包括其他的排序算法类)私有化构造函数,是一种设计上的选择,而不是语法或者逻辑上的要求。
=========
我为什么倾向于这么设计,因为这是一个“算法类”,它封装了“选择排序”这个动作,他表述的不是一个名词。
我们可以说你有一辆车,我有一辆车;
你有一只猫,我有一只狗;
你用这棵二分搜索树存储学生的成绩,我用那棵二分搜索树存储我想要学的单词,
你用这个链表存储货品信息,我用那个链表存储员工信息,
等等等等;
但是,你有一个选择排序,我有一个选择排序,这说不通。选择排序就是选择排序。你的和我的没有区别。
这有点儿类似 Java 的数学类(Math),我们不能构造 Math 的实例,其背后实现的机制也是私有化 Math 的构造方法。Java 为什么选择这样设计?就是因为,你有一个数学,我有一个数学,这说不通。数学就是数学,我们其实只是调用数学类中的各种运算方法而已。
Math.sin(theta) 就是计算 theta 的 sin 值。而不是:
Math math1 = new Math();
math1.sin(theta);
Math math2 = new Math();
math2.sin(theta);
我们为什么在不同的程序中(甚至相同的程序中),创建不同的 Math 的实例,来计算 sin?这完全没有必要。就是因为你的 Math 和我的 Math 没有什么区别。
==========
其实,这个问题本质在于,Java 完全的面向对象,任何东西都必须封装在一个类中,所导致的。
实际上,任何事物都是一个“对象”,这个假设本身是不合理的(当然更深入的分析,就变成到底什么是对象,甚至到了哲学层面的讨论了)。数学或者选择排序就是很好的例子。
这也是很多人诟病 Java 的一点原因——设计上的灵活性很差。这也是为什么,其实大多数语言不会像 Java 那样,必须面向对象,一切都要封装到对象中。从古老的 C/C++,流行的 Python,新兴的 Swift 等等等等,都不是这样设计的(或者说这样规定的)。不过这些已经完全超过这个课程的范围了:)
继续加油!:)
相似问题