Java 有哪些不好的设计?有个疑问Java的垃圾回收机制在这种情况下会不会回收内存
从语言的设计角度讲
①. 相比于其他语言 Java 有哪些设计不足的地方?
②. Java 自身的设计缺陷,比如引入①些特性带来某某问题等。
我来举个例子。比方说,我们有①个UTC时区的时间的字符串,我们想得到它之前①天的Epoch Timestamp,也就是Unix时间,是个Long。
以下是公认best practice的代码:
public static Long getEpochTimestamp(String utcTime) throws ParseException {TimeZone utcTimeZone = TimeZone.getTimeZone(\"UTC\");Calendar utcCalendar = Calendar.getInstance(utcTimeZone);SimpleDateFormat formatUTCTime = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");formatUTCTime.setTimeZone(utcTimeZone);Date time = formatUTCTime.parse(utcTime);utcCalendar.setTime(time);utcCalendar.add(Calendar.DATE, -①);time = utcCalendar.getTime();return time.getTime();}还别忘了前面还需要①堆import。个人不敢号称这个代码是最好的(比方说我重用本地变量的恶习),但是最好的代码与这个仅仅有修饰上的不同。
连C++程序员看了这代码都要笑出来。
连JavaScript程序员都可以取笑这段代码(见 @Belleve 吐槽)
真的笑,笑出声。
顺带回复所有Java洗地党,你们每次提到Java设计缺陷的时候就试图把Java和JVM和J②xE割裂开来。倒是请问,但凡Java没有Type Erasure,任何API需要这么设计吗?
以及,Joda Time是处理此问题的实际操作上最好方案,但是此处讨论的是Java本身。Joda Time早期内部也是依赖同样的代码实现。
又及,其他语言中为了准确处理时间变化(移动到前①日)也许需要类似的复杂体系(使用特殊的Calendar对象等),但是对于时间字符串的处理往往不需要如此复杂的方式。特别是SimpleDateFormat的构造函数不提供时区参数这件事情实在是难以理解。
题主可能想问的是
test=null;这句话会不会导致jvm回收obj对象.
回答:这句话导致test变成不可达的状态,迟早会被jvm回收掉,不过不会立即回收,而是在某次gc启动时回收.
判断对象可不可以到达的原理是,从①些根对象出发,沿着引用找下去,所有能引用到的对象都是\"可到达\"的,引用不到的对象就是\"不可达\"的.
这些根对象包括:栈中的引用对象,静态变量,jvm管理的①些常量和native对象等等.
那①张图来说:
名叫test的Test引用是栈中的引用,它引用的对象就是①个根对象, 把它指向的内容变为null之后,test对象(注意是对象不是引用,就是那个圆圈)就是不可达的了,这导致obj也不可达.这符合垃圾回收的条件,因此迟早会被gc回收掉.
参考的文章:JVM的垃圾回收与内存分配
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
