【发布时间】:2009-01-11 22:22:35
【问题描述】:
正如问题所说,C++ 程序员在切换到 Java 时会面临哪些常见/主要问题?我正在寻找工程师必须进行的一些广泛的主题名称或示例以及日常调整。然后我可以去深入阅读这个。
我对在 C++ 中工作多年并不得不使用 Java 的工程师的意见特别感兴趣,但我们非常欢迎其他人的任何指点甚至书籍推荐。
【问题讨论】:
标签: java c++ language-switching
正如问题所说,C++ 程序员在切换到 Java 时会面临哪些常见/主要问题?我正在寻找工程师必须进行的一些广泛的主题名称或示例以及日常调整。然后我可以去深入阅读这个。
我对在 C++ 中工作多年并不得不使用 Java 的工程师的意见特别感兴趣,但我们非常欢迎其他人的任何指点甚至书籍推荐。
【问题讨论】:
标签: java c++ language-switching
改为使用这种模式:
OutputStream os;
try {
os = ...
// do stuff
} finally {
try { os.close(); } catch (Exception e) { }
}
你最终会做很多这样的事情。
【讨论】:
我从 C++ 到 Java 的最大障碍是放弃过程代码。我非常习惯在程序中将我的所有对象捆绑在一起。没有 java 中的程序代码,我到处都做了循环引用。我必须学习如何从对象中调用对象,而不会使它们相互依赖。这是最大的障碍,但最容易克服。
第二个个人问题是文档。 JavaDoc 很有用,但是对于许多 Java 项目来说,他们误以为所需要的只是 JavaDoc。我在 C++ 项目中看到了更好的文档。这可能只是个人对代码之外文档的偏好。
第三个。其实java中有指针,只是没有指针算法。在 java 中,它们被称为 references。不要以为你可以忽略事物所指向的地方,它会大咬一口回来。
== 和 .equals 不相等。
== 将查看指针(引用),而 .equals 将查看引用指向的值。
【讨论】:
Generics(而不是模板),特别是使用type erasure 实现它们的方式。
【讨论】:
既然您提到了书籍推荐,请务必阅读Effective Java, 2nd ed.——它解决了我在答案中看到的大部分陷阱。
【讨论】:
在考虑复制构造函数时意外创建了一个引用:
myClass me = new myClass();
myClass somebodyElse = me; /* A reference, not a value copied into an independent instance! */
somebodyElse.setPhoneNumber(5551234);
/* Hey... how come my phone doesn't work anymore?!?!? */
【讨论】:
【讨论】:
习惯使用垃圾收集器。无法依赖析构函数来清理 GC 无法处理的资源。
一切都是按值传递的,因为传递的是引用而不是对象。
没有复制构造函数,除非你需要克隆。没有赋值运算符。
所有方法默认都是虚的,这与C++相反。
对接口的显式语言支持 - C++ 中的纯虚拟类。
【讨论】:
正是这些细微的语法差异吸引了我。缺乏析构函数。
另一方面,能够为每个类(非常方便或测试)编写一个 main 是非常好的;习惯之后,jar 文件的结构和技巧真的很不错;语义是完全定义的(例如,int 在任何地方都是相同的)这一事实非常好。
【讨论】:
我最糟糕的问题是始终牢记内存的所有权。在 C++ 中,这是必须要做的事情,它在开发人员的脑海中创造了一些难以克服的模式。在 Java 中,我可以忘记它(在很大程度上,无论如何),这使得一些在 C++ 中非常尴尬的算法和方法成为可能。
【讨论】:
Java 中没有对象,只有对象的引用。例如:
MyClass myClass; // no object is created unlike C++.
但是:
MyClass myClass = new MyClass(); // Now it is a valid java object reference.
【讨论】:
我读过的最好的Java“陷阱”书是Java Puzzlers: Traps, Pitfalls, and Corner Cases。它并非专门针对 C++ 开发人员,但它充满了您需要注意的示例。
【讨论】:
将方法参数指定为 final 并不意味着你最初认为的意思
private void doSomething(final MyObject myObj){
...
myObj.setSomething("this will change the obj in the calling method too");
...
}
因为 java 是按值传递的,所以它正在做您所要求的事情,除非您了解 java 如何传递引用而不是对象的值,否则不会立即显而易见。
【讨论】:
另一个值得注意的是关键字final 和const。 Java 将 const 定义为保留关键字,但没有详细说明它的用法。还有
object1=object2
不复制它更改引用的对象
【讨论】:
所有方法都是虚拟的。
参数化类型(泛型)实际上不会创建代码参数特定的代码(即List<String> 使用与List<Object>; 相同的字节码,如果您尝试将Integer 放入,编译器是唯一会抱怨的东西前者)。
可变参数很简单。
【讨论】: