java开发的缺点有哪些? Java开发有哪些不足之处
JAVA\u8bed\u8a00\u7684\u4f18\u7f3a\u70b9\u6709\u54ea\u4e9b\uff1f\u5d4c\u5165\u5f0f\u7684JAVA\u5f00\u53d1\u5e73\u53f0\u662f\u4ec0\u4e48?java\u8bed\u8a00\u7684\u4f18\u70b9:1:\u9762\u76f8\u5bf9\u8c61\uff0c\u7f16\u7a0b\u975e\u5e38\u7075\u6d3b;2:\u8de8\u5e73\u53f0\uff0c\u53ef\u5728\u4e0d\u540c\u7684\u5e73\u53f0\u79fb\u690d;3:\u8bed\u8a00\u5f88\u9c81\u68d2\uff0c\u5f88\u5b89\u5168\u7684\u4e00\u95e8\u8bed\u8a00\uff0c\u505a\u51fa\u6765\u7684\u7cfb\u7edf\u5f88\u5b89\u5168;4:\u5e94\u7528\u8303\u56f4\u5e7f\uff0c\u793e\u533a\u8bba\u575b\u6d3b\u8dc3\u7f3a\u70b9\u561b\uff0c\u6574\u4f53\u6765\u8bf4java\u5c31\u662f\u6162\u4e86\u70b9\uff0c\u76f8\u5bf9C\uff0cc++\u662f\u6709\u70b9\u5dee\u4e86\u70b9\u7684.\u5d4c\u5165\u5f0fjava\u5f00\u53d1\u5e73\u53f0\u591a\u7684\u53bb\u4e86\uff0c\u6bd4\u5982android\u7b97\u662f\u4e00\u4e2a\u5e73\u53f0\uff0c\u6216\u8005java
ME\u4e5f\u7b97\u4e00\u4e2a\uff0c\u6216\u8005\u5176\u4ed6\u7684\u5f00\u53d1\u5e73\u53f0\uff0c\u53ea\u8981\u662f\u57fa\u4e8ejava\u5f00\u53d1\u7684\u5d4c\u5165\u5f0f\u7cfb\u7edf\uff0c\u5e94\u8be5\u90fd\u7b97\u662f\u5e73\u53f0\u4e86\u3002
1\u3001\u6846\u67b6\u6cdb\u6ee5,\u76f8\u5bf9VS\u800c\u8a00\u7f3a\u5c11\u5f3a\u5927\u7684IDE,JDK\u9700\u8981\u4e13\u95e8\u4e0b\u8f7d
2\u3001IDE\u4e0d\u9700\u8981\u4e86,eclipse\u5f3a\u5927\u5230\u65e0\u4ee5\u590d\u52a0\u4e86.\u6700\u5927\u7684\u7f3a\u70b9\u5c31\u662f\u6162\uff0c\u5f00\u6e90\u4e1c\u897f\u592a\u6742\uff0c\u4ec0\u4e48\u90fd\u80fd\u5f80\u4e0a\u5957\uff0c\u6807\u51c6\u4e0d\u4e00
3\u3001\u5728\u5f00\u53d1\u901f\u5ea6\u4e0a\u76f8\u5bf9\u53e6\u59162P\uff08ASP.PHP\uff09\u800c\u8a00\u6162\u4e9b
4\u3001\u5f00\u53d1\u7684\u65f6\u95f4\u4e00\u5b9a\u4f1a\u5f88\u957f\u65f6\u95f4\uff0c\u6548\u7387\u4e0d\u9ad8\u554a\uff0c\u867d\u7136\u6709SSH\u6846\u67b6\uff0c\u4f46\u662f\u5f00\u53d1\u7684\u65f6\u5019\u771f\u6b63\u7528SSH\u7684\u4e5f\u4e0d\u591a\u3002
5\u3001\u76f8\u5bf9\u800c\u8a00\uff0cjava\u8fd0\u884c\u901f\u5ea6\u6162\uff0c\u5f00\u53d1\u65f6\u95f4\u957f
6\u3001\u6846\u67b6\u592a\u591a\uff0c\u5f00\u6e90\u7684\u4e1c\u897f\u6709\u591a\u6709\u6742\uff0c\u8fd0\u884c\u901f\u5ea6\u6bd4\u5176\u4ed6\u7684\uff08\u4f8b\u5982\uff1aASP)\u6162\uff0c\u521d\u5b66\u8005\u9762\u5bf9\u8fd9\u4e48\u5e9e\u5927\u590d\u6742\u7684\u4f53\u7cfb\u7ed3\u6784\uff0c\u5b66\u4e60\u6bd4\u8f83\u56f0\u96be\u3002
1、缺少闭包(closure):我想这个不需要解释了。函数式编程已经存在几十年了,但最近几年,它们获得了越来越多的关注,最主要的原因,是它可以自然地编写并行程序。我部分的同意Joshua Bloch强调在Java中引入闭包的问题需要再想一想(BGGA提议的方式真的很糟),至少闭包的缺失,使得在Java中做任何真正的函数式编程都是不可能的。
2、缺少一等函数:这个问题与前一个有些关联,但我认为它更糟糕。在Java里,要达到类似效果的唯一方式,是使用著名的、丑陋悲惨的单方法匿名内部类,但这看上去的确是一个拙劣的方法。甚至在C#中,也通过代理机制,提供了一个更好的实现。
3、原生类型(Primitive types):如果在Java中一切皆对象,那是多么完美啊,但他们偏偏不这样设计。因而,这一点导致了一些问题,比如,不能把一个int放到集合(Collection)里,这个在Java5中通过自动装箱特性得到了解决(下面会提到)。它也造成了传值与传引用上的困扰,原生类型数据是通过值传给方法的(复制一份拷贝,然后传给函数),而真正的对象是通过传递(译注:其实是复制对象地址再传递,因此应该也是传值方式,只是由于函数内部可通过这个对象地址访问对象,因此效果上类似传引用)。
4、自动装箱(Autoboxing)和自动拆箱(autounboxing):这个特性是为了解决因原生类型的存在所导致的问题,在Java5引入的。它允许静默地转换原生类型到相应的对象,但这常常导致其它的问题。比如Integer可以为null,但int不能,因此这时JVM只能抛出一个难以调试的空指针异常(NullPointerException)。此外,它还可能导致其它奇怪的行为,就像下面的例子,我们就很难理解,变量test为什么是false:
Intger a = new Integer(1024);
Intger b = new Integer(1024);
boolean test = a < b || a == b || a > b;
5、缺少范型具类化:范型是Java5引入的一个很酷的特征,但是为了保持与旧版本Java的兼容性,导致缺失某些重要的特性,尤其是不能在运行时反省范型的类型。例如,你有一个方法,接受List参数,如果传进来一个List,你却不能知道运行里该范型的确切类型。同理,你也不能创建范型数组。这意味着,尽管下面的代码看起来很自然,但却不编译不了:
List[] listsOfStrings = new List[3];
6、不可避免的范型警告:你有发现过自己陷入不可能去掉的关于范型的警告么?如果你像我一样大量使用范型,我打赌你碰到过。事实上,是这个问题的规模化症状,让他们认为需要引入一个特定的注解(@SuppressWarnings("unchecked"))来处理这种情况,我觉得,范型应该可能被设计的更好。
7、不能传void给方法调用:我得承认,这种给方法传递void的需求,乍一看有些怪异。我喜欢DSL,当我实现自己的DSL库(lambdaj)的一个特定特性时,我不得不需要一个方法声明成这样的签名:void doSomething(Object parameter),这里为这个方法传进来的参数parameter,是另一个方法调用的结果,它唯一的目的,是注册调用(的对象)自身,以可以在以后执行它。让我吃惊的是,即使println方法返回void,看上去也并没有一个好理由,不允许我把代码写成这样,:
doSomething(System.out.println("test"));
8、没有原生的代理机制:代理是一种非常有效和应用广泛的模式,但Java提供的代理机制,只针对接口,而不是具体类。这是为什么象cblib这样提供这种机制的库,被如此多的主流框架,如Spring和Hibernate,采用的原因。此外,由于cglib通过运行时创建被代理类的子类来实现的,因此这些种方式有一个众所周知的限制——不能代理final类,比如String。
9、差劲的Switch...case语句:Java规定,switch...case只能选择int和enum(Java5开始)。这一点如果跟更现代的语言如Scala相比,看起来简直太弱了。
10、受检查异常(Checked exception):类似原生类型,受检查异常也已经成为Java的一个罪孽之源。它迫使程序员必须做下面两件极其糟糕讨厌的事情中的一个:让你的代码里充斥大量的、糟糕难读的、容易出错的try...catch语句,而这样做的最大意义,只是将捕获的异常,包装成运行时异常,然后再重新抛出;或者是让大量的抛出声明子句污染你的API,让接口缺少灵活性和可扩展性。
真正的问题是,这里我提到的这几大主要问题,唯一的解决办法,是要做一个痛苦的决择,定义一套新的语言规范,放下当前版本的向后兼容性。我猜他们永远也不会这么做,虽然我相信,如果编写一个能够自动转换旧Java源码的程序,让它们与假设的新版本兼容,并不是很困难。最后,这就是我决定开始寻找一个更好的JVM兼容语言的原因。
绛旓細2銆佺己灏戜竴绛夊嚱鏁帮細杩欎釜闂涓庡墠涓涓湁浜涘叧鑱锛屼絾鎴戣涓哄畠鏇寸碂绯曘傚湪Java閲岋紝瑕佽揪鍒扮被浼兼晥鏋滅殑鍞竴鏂瑰紡锛屾槸浣跨敤钁楀悕鐨勩佷笐闄嬫偛鎯ㄧ殑鍗曟柟娉曞尶鍚嶅唴閮ㄧ被锛屼絾杩欑湅涓婂幓鐨勭‘鏄竴涓嫏鍔g殑鏂规硶銆傜敋鑷冲湪C#涓紝涔熼氳繃浠g悊鏈哄埗锛屾彁渚涗簡涓涓洿濂界殑瀹炵幇銆3銆佸師鐢熺被鍨嬶紙Primitive types锛夛細濡傛灉鍦↗ava涓竴鍒囩殕瀵硅薄锛岄偅...
绛旓細Java鐨勭己鐐瑰緢澶氥傘傘傛垜鍦ㄨ繖閲岀畝鍗曠殑璇翠竴涓嬨傘绗竴:杩愯閫熷害鎱锛屼紬鎵鍛ㄧ煡锛孞ava绋嬪簭鐨勮繍琛屼緷璧栦簬 Java铏氭嫙鏈猴紝鎵浠ョ浉瀵逛簬鍏朵粬璇█(姹囩紪,C,C++)缂栧啓鐨勭▼搴忔參锛屽洜涓哄畠涓嶆槸鐩存帴锛屾墽琛屾満鍣ㄧ爜銆傜浜:鍥犱负Java鑰冭檻鍒颁簡璺ㄥ钩鍙版銆傛墍浠ヤ粬涓嶈兘鍍忚瑷 锛堜緥濡:姹囩紪,C)閭f牱鏇存帴杩戞搷浣滅郴缁銆備篃灏变笉鑳藉拰鎿嶄綔绯荤粺...
绛旓細1銆佽法骞冲彴鎬锛岃櫧鐒舵槸寰堝ソ鐨勪紭鍔匡紝鍙互璁﹋ava鍦ㄤ换浣曠殑绯荤粺涓繍琛岋紝浣嗘槸鍓嶆彁鏄绯荤粺瑕佸畨瑁卝ava铏氭嫙鏈猴紝杩欐牱瀵艰嚧涓浜沯ava缂栧啓鐨勬闈㈢▼搴忔棤娉曞湪涓鑸殑鐢ㄦ埛(娌℃湁瀹夎java铏氭嫙鏈虹殑鐢ㄦ埛)涓婁娇鐢 2銆乯ava鐨勮韩鍚庢槸sun鍏徃锛屾彁渚涘強鏃剁殑api鏇存柊锛屼絾鏄杩囧鐨勭増鏈鑷磈ava鐨勫悜涓嬪吋瀹规у緢宸銆傝宻un鍏徃鍦╦2ee涓婄殑鏍囧噯瀹氫箟...
绛旓細1銆丣ava璇█鏄畝鍗曠殑銆侸ava璇█鐨勮娉曚笌C璇█鍜孋++璇█寰堟帴杩戯紝浣垮緱澶у鏁扮▼搴忓憳寰堝鏄撳涔犲拰浣跨敤Java銆傚彟涓鏂归潰锛孞ava涓㈠純浜咰++ 涓緢灏戜娇鐢ㄧ殑銆佸緢闅剧悊瑙g殑銆佷护浜鸿糠鎯戠殑閭d簺鐗规э紝濡鎿嶄綔绗﹂噸杞姐佸缁ф壙銆佽嚜鍔ㄧ殑寮哄埗绫诲瀷杞崲銆傜壒鍒湴锛孞ava璇█涓嶄娇鐢ㄦ寚閽堬紝骞舵彁渚涗簡鑷姩鐨勫簾鏂欐敹闆嗭紝浣垮緱绋嬪簭鍛樹笉蹇呬负鍐呭瓨绠$悊...
绛旓細2.3 瀹夊叏鎬ч棶棰 Java宸插疄鐜颁簡鍑犵瀹夊叏鎬ф満鍒躲備絾杩樺瓨鍦ㄧ殑闂锛瀵筧pplets鏈夎澶氶檺鍒銆侸ava鐜版湁鐨勫畨鍏ㄦā鍨嬪苟涓嶅畬鍠勶紝鏈変簺寮鍙戜汉鍛樿兘鐢熸垚宓屽叆Web鐨凧ava灏忕▼搴忥紝鍗充笉鍙嬪ソ鐨勫皬绋嬪簭銆傝繖绉嶇▼搴忓彲鑳界粰Web鐢ㄦ埛甯︽潵楹荤儲銆傚畨鍏ㄦч棶棰橀渶瑕佽繘涓姝ョ殑鐮旂┒锛屽寘鎷彁鍑烘柊鐨凧ava瀹夊叏妯″瀷銆2.4 宸叉湁杞欢浜у搧鐨勫厖鍒嗗埄鐢 濡傛灉...
绛旓細鍔ㄨ绠楅鍩熺殑琛ㄧ幇姣旇緝绯熺硶,寰堝皯鏈夊埄瑙扨vthon寮鍙戠殑绉诲姩搴旂敤 2.C/C++ 浼樺娍: 鍙互琚祵鍏ヤ换浣曠幇浠e鐞嗗櫒涓嚑涔庢墍鏈夋搷浣滅郴 缁熼兘鏀寔C/C++,璺ㄥ钩鍙版ч潪甯稿ソ 鍔e娍.瀛︿範闅惧害澶 涓旀嫢鏈夊ぇ閲忔瀬涓哄鏉傜殑鍔熻兘浜や簰鏂瑰紡瀹规槗閫犳垚璧勬簮娴垂 3. Java 浼樺娍: 涓栫晫涓婁娇鐢ㄨ寖鍥存渶骞跨殑璇█Java 闇姹傛椇鐩涗笉鏂彂灞旳ndroid搴旂敤寮鍙戠殑鍩虹煶銆 鍔...
绛旓細浜屻Java鐨勪紭鍔e娍Java鏄法骞冲彴鐨勶紝搴旂敤绋嬪簭鏈夊緢澶氭柟闈紝濡侫ndroid锛孲wing锛孞2EE锛孞2ME绛夈傚氨涓氱浉瀵瑰箍娉涳紝甯傚満灏变笟闇姹備篃寰堝ぇ銆備絾鏄紝瑗垮畨璁$畻鏈哄煿璁鏍¤涓JAVA鐨瀛︿範闂ㄦ楂樹簬php锛岄渶瑕佸涔犳洿澶氱殑鍐呭锛屾帉鎻ava鎶鏈紝涓鑸渶瑕佸叚涓湀浠ヤ笂鐨勬椂闂淬備笁銆丳HP鐨勪紭鍔e娍PHP涓昏鐢ㄤ簬缃戠珯鐨寮鍙锛屽緢澶氬皬缃戠珯閮芥槸鐢≒HP...
绛旓細C++缂栬瘧鐨勬槸鏈湴鐮, 浼樼偣鏄惎鍔ㄥ揩,鑰屼笖鍙互绮剧‘鎺у埗璧勬簮鍥犳鍙互寮鍙寰堥珮鏁堢殑绋嬪簭. 缂虹偣鏄紪绋嬮夯鐑, 鑰屼笖瀹规槗鐣欎笅瀹夊叏闅愭偅. 璺ㄥ钩鍙伴潬婧愪唬鐮佸湪鍚勪釜骞冲彴闂村垎鍒紪璇(涓澶勭紪鍐欏埌澶勭紪璇)Java缂栬瘧鐨勬槸瀛楄妭鐮 ,璺烠++鐩稿弽, 鍚姩涓嶅蹇,鏁堢巼涓嶅楂, 闅句互绮剧‘鎺у埗鍐呭瓨, 浣嗘槸浼樼偣鏄紪绋嬫瘮C++瀹规槗, 浠g爜姣旇緝瀹夊叏...
绛旓細澶у瀷浼佷笟搴旂敤绋嬪簭锛JavaEE閫傜敤浜庡ぇ鍨嬩紒涓氬簲鐢ㄧ▼搴寮鍙锛屽彲浠ユ敮鎸侀珮骞跺彂銆侀珮鍚炲悙閲忓拰澶ц妯℃暟鎹鐞嗐缂虹偣锛氬涔犳洸绾匡細涓庡叾浠栬瑷鐩告瘮锛孞avaEE鏈夎緝澶х殑瀛︿範鏇茬嚎锛岄渶瑕佸涔犱紬澶氱殑妗嗘灦鍜屾妧鏈傚鏉傛э細JavaEE搴旂敤绋嬪簭閫氬父姣旇緝澶嶆潅锛岄渶瑕佽璁″拰瀹炵幇澶氫釜缁勪欢涔嬮棿鐨勫崗浣溿傛ц兘锛氫笌鍏朵粬璇█鐩告瘮锛孞avaEE鐨勬ц兘鍙兘绋嶄綆...
绛旓細1銆侀熷害浼樺娍锛氬澶勭悊鍣細澶氬鐞嗗櫒涓婇潰骞跺彂鍙樻垚鏃犵枒浼氳绋嬪簭杩愯寰堝揩銆傚崟澶勭悊鍣細濡傛灉鏄崟澶勭悊鍣ㄧ殑鏈哄櫒锛岄偅涔堝苟鍙戠紪绋嬪彲鑳界浉瀵逛簬椤哄簭缂栫▼娌鏈変粈涔鍙樺寲銆備絾鏄紝濡傛灉鍏朵腑鏌愪竴涓换鍔′篃璁镐細鍙戠敓闃诲鐨勮瘽锛岄偅涔堝嵆浣挎槸鍗曞鐞嗗櫒锛屼娇鐢ㄥ苟鍙戠紪绋嬩篃浼氬甫鏉ュ緢澶х殑濂藉锛岃繖鏍凤紝鏌愪釜浠诲姟闃诲鐨勬椂鍊欙紝鍏朵粬浠诲姟涔熷彲浠ョ户缁繍琛...