谈谈Java的对象
来源:互联网 发布:java模拟器apk下载4.4 编辑:程序博客网 时间:2024/05/16 10:16
1. 目的
本文通过简单的示例,阐述Java中对象的概念,避免TXs犯类似的错误。
本文的代码示例均来源于实际产品的遗留代码,但抽象为更加简单易懂的例子。
2. 示例1
先看一段代码,其主要意思是替换列表中某个元素的属性。
2.1 Student.java
public class Student {int id;private String name = null;int score;public Student(int id, String name, int score) {this.id = id;this.name = name;this.score = score;}public int getId() {return id;}public String getName() {return name;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public String toString() {return "Student[id=" + id+ ", name=" + name+ ", score=" + score+ ", hashCode=" + hashCode()+ "]";}}
2.2 StudentObjects.java
import java.util.ArrayList;import java.util.List;public class StudentObjects {private List<Student> students = new ArrayList<Student>();private void dumpObjects() {for (Student s : students) {System.out.println(s);}}private void addSomeObjects() {students.add(new Student(1, "first", 10));students.add(new Student(2, "second", 20));students.add(new Student(3, "third", 30));}private void updateObject() {int id = 2;for (Student s : students) {if (s.getId() == id) {Student temp = s;temp.setScore(200);students.add(students.indexOf(s), temp);students.remove(s);return;}}}private static void test() {StudentObjects objects = new StudentObjects();objects.addSomeObjects();objects.dumpObjects();objects.updateObject();objects.dumpObjects();}public static void main(String[] args) {test();}}
2.3 运行结果
Student[id=1, name=first, score=10, hashCode=31168322]Student[id=2, name=second, score=20, hashCode=17225372]Student[id=3, name=third, score=30, hashCode=5433634]Student[id=1, name=first, score=10, hashCode=31168322]Student[id=2, name=second, score=200, hashCode=17225372]Student[id=3, name=third, score=30, hashCode=5433634]
2.4 分析
我们要讨论的是上述代码中的updateObjects()方法。
这里的替换或更改属性的算法,是典型的对于Java对象不慎理解的情形。变量temp和s其实指向的是同一个对象,因此在列表中add&remove完全是不必要的操作。
为了更加明确说明对象的概念,我们在toString()中把hashCode也打印出来了,可以看出,temp和s其实完全是heap中的同一个对象。
2.5 改进的代码
private void goodUpdateObject() {int id = 2;for (Student s : students) {if (s.getId() == id) {s.setScore(200);return;}}}
3. 题外话
通过本文的例子,可以发现写这个代码的TX知道的东西很多,包括add, indexOf, remove。由此说明,对相关知识点(比如List)还是做了相当的功课。但是否这样的代码就是我们提倡的呢?答案显然是否定的。
- 我们需要的是简单的算法、简单明了的代码,越简单越好,因为代码是写给人看的,而不是计算机看的。
- 通过复杂的算法去完成了简单的任务,是在制造问题,而不是解决问题。——因为让维护人员看着诡异。
- 诡异的代码无形中增加了程序的运行成本,即恶化了程序的性能。现在的软件产品的规模通常都是以10KLOC为单位,在这种规模的软件中,如果处处都充斥着本文类似的编写方式,可想对产品的性能会有多大的冲击。——对于smart phone就是影响其续航能力。
0 0
- 谈谈Java的对象
- 谈谈Java中对象的比较
- 谈谈Java的对象(续)
- 谈谈我的Java学习之对象
- 谈谈java中的对象
- 谈谈Java对象序列化
- 谈谈JAVA的数组(数组是对象吗?)
- 谈谈javascript的面向对象
- 谈谈 ES6 的 Promise 对象
- 谈谈 ES6 的 Promise 对象
- 谈谈 ES6 的 Promise 对象
- 谈谈 ES6 的 Promise 对象
- 谈谈 ES6 的 Promise 对象
- 谈谈 ES6 的 Promise 对象
- 谈谈Java的学习方法
- 谈谈Java的优点
- 谈谈java的运行机制
- 谈谈java的运行机制
- BB FlashBack Pro 4绿化批处理源码分享
- 【LeetCode】Linked List Cycle
- 编程实现memcpy()
- jar包的冲突
- C/C++学习笔记1 - 深入了解scanf()/getchar(cin、cin.get()、cin.getline()、getline()、gets()、getchar()的区别 (OJ时候会用到)
- 谈谈Java的对象
- MyEclipse配置输出控制台信息至文本文件中
- POJ_2513_Color Sticks_欧拉通路,Trie数、并查集优化
- POJ1008解题报告
- 字符串四则运算表达式的计算(华为机试)
- JQuery中$.ajax()方法参数详解
- ViewPager固定标题的案例
- Python中__init__方法介绍
- 【BZOJ】【P3545】【ONTAK2010】【Peaks】【题解】【离线+并查集+平衡树启发式合并】