关于 Java 很啰嗦的问题

2022-05-12 12:19:17 +08:00
 Joker123456789

我先声明啊,我不是来吹捧 java 的,我只是想说一个事实,编程语言 没有谁绝对的碾压谁,真遇到了实际业务需求,写出来的代码量绝对是半斤八两。

我希望大家 在 吐槽一门语言的时候,可以理性一点,不要瞎喷。这篇文章的用意就在于此。

还有一点,我用 go 来比较,是因为 go 擅长的场景,跟 java 有一定的重叠,有很多公司都用 go 开发 web 。绝对没有对 go 不敬的意思。

首先目录问题

总结下来,从工作量的角度来看,就是多了一个倒置的域名而已,而且只需要花建一层目录的时间,并且这个倒置的域名 是有他的意义在里面的,你们可以把他看做是这个

// go 语言里的 import ,前面也有一个域名+项目名 来确定唯一性,包名里的倒置域名就是起这个作用的
import "github.com/scan-util/xxx/xxx"

还有很重要的一点,你们喷来喷去的那些多余的目录结构,在我们的观念里 根本就不存在,因为从来没有手工去创建过,要不是你们来吐槽,我们还真想不到这一点。

不是因为 习惯了,而是真的从来没有为他们花过 5 秒钟以上的时间。有的连一毫秒都没花过。

方法语法

go

func BytesToString(val []byte) string

java

public String BytesToString(byte[] val)

我真没看出来多了什么东西

定义变量

go

name := "张三";

var map = make(map[string]interface{})
var array = make(string[], 10);

java

String name = "张三";

Map<String, Object> map = new HashMap<>();
String[] array = new String[10];

好像多了点东西,又好像没多什么。

循环

go

for(i:=0;i<100;i++){

}

for(i<100){

}

java

for(int i=0;i<100;i++){

}

while(i<100){

}

确实多了几个字母。

创建类

go

我知道这叫结构体,跟类是两码事,但是 go 就是用它来兼容 oop 的,所以我只能用它来举例子,因为没有其他语法可以实现 oop 了

type DemoParam struct {
    name string
}

func (demoParam *DemoParam) FormValues(key string) []string {
}

java

class DemoParam {
    public String name;
    
    public String[] FormValues(String key){
        
    }
}

字数上相差多少,我是懒得数了,但是你们真的不觉得 java 的结构更清晰吗? 其他的继承,多态 我就不拿出来说了,go 基本上是 用的 c 的编程思想,oop 只是个兼容, 所以用 java 来跟他比 oop 没什么可比性。因为是两个方向。

异常处理

go


func testFunction(paramStr string) (string, error) {
    if xxx {
        return Errors.New("xxxx");
    }
}

paramStr, err := testFunction("ok")                              
if err != nil {                           
    log.Println(err.Error())                           
}

java

public String testFunction(String paramStr){
    if (xxx) {
        throw new Execption("xxx");
    }
}

try {
    String paramStr = testFunction("ok");
} catch(Execption e){
    log.Println(e.getMessage); 
}

这个看起来 go 好像 舒服一点,但是,实际场景下 go 经常是这种姿势

paramStr, err := testFunction("ok")                              
if err != nil {                           
    log.Println(err.Error())                           
}

paramStr, err := testFunction2("ok")                              
if err != nil {                           
    log.Println(err.Error())                           
}

paramStr, err := testFunction3("ok")                              
if err != nil {                           
    log.Println(err.Error())                           
}

而 java 还是只需要这样

try {
    String paramStr = testFunction("ok");
    String paramStr = testFunction2("ok");
    String paramStr = testFunction3("ok");
} catch(Execption e){
    log.Println(e.getMessage); 
}

并且这是 经过人为判断后,返回的错误提示,如果是意外的异常呢? go 里面叫 panic ,java 只要用 try catch 包住了 就可以捕获,但是 go 需要用 defer ,而且一旦抛出异常就意味着这个函数结束了,你如果想在出异常后,处理一下 然后继续往下走,go 会非常的麻烦。

拆箱

go

// 如果有一个 interface{} 类型的变量 a ,想转成 int
// 你必须明确的知道,他装箱前就是 int ,不然根本没法拆,必须做一下类型判断。
// 我之前在写框架的时候 就被折磨的够呛,一大堆不必要的 if

java

// 不管装箱前是什么,只要他的值是一个整数
// 无论是 1 , 还是 "1", 都可以这么转
Integer aInt = Integer.parseInteger(a.toString());

// 也可以直接拆成 String
a.toString();

如果你们还不服,那很好办,

你们出一个需求给我,我用 java ,你们用 go ,nodejs ,python ,php 随便什么语言,最后来比比 谁的代码少一些。 我敢说,绝对半斤八两,不可能有谁碾压谁的。

而且还有一定的概率,java 在 丰富的生态+强大官方库的 加持下,可以更快完成。

20892 次点击
所在节点    Java
257 条回复
lisongeee
2022-05-12 14:23:06 +08:00
@wolfie

《果然 java 是个阿猫阿狗都能踩两脚,以字符个数来踩是没想到的。》

人家题主明确说明了《最后来比比 谁的代码少一些。 我敢说,绝对半斤八两,不可能有谁碾压谁的。》

比的就是代码量就算字符数量,我不比这个我比什么???
lawler
2022-05-12 14:23:32 +08:00
看到 C#,真的就想笑。C#应该很少年轻人在用了吧?而 35+的程序员应该知道 C#是 Java 的语法糖吧?
Java -> J# -> C#..
Java 语法糖系列:C#/JS/Scala/Kotlin..

Go 生态离 Python 都差一截,语法糖再多都不值一提。

看来能和 Java 一战的,真的只有 PHP 了...请求 PHPer 前来应战。
abctt
2022-05-12 14:24:15 +08:00
@Buges 你可真是牛逼儿,国内主要开发语言时 haskell 的公司麻烦告知一下,或着什么牛逼的项目是这个语言开发的,企业级代码还手写快排,你也真够行的。
clownpiece
2022-05-12 14:28:27 +08:00
@lisongeee 那现在一段 java 代码的逻辑就是这样,内部有的操作走 setter 有的直接改字段,用 kotlin 实现反而增加了心智负担没问题吧
lisongeee
2022-05-12 14:30:44 +08:00
@clownpiece 我不想和你讨论了,我以前就是写 java 的,我想请你先去学或者了解一下 kotlin ,先了解两种语言再来评价。

还有我再提醒你一下 人家题主明确说明了《最后来比比 谁的代码少一些。 我敢说,绝对半斤八两,不可能有谁碾压谁的。》

在这个问题我拒绝和你讨论和代码量无关的话题
pkwenda
2022-05-12 14:32:53 +08:00
@aragakiyuii #65 请问这个配色用的 vscode 还是 idea 啊?
jjwjiang
2022-05-12 14:34:31 +08:00
别的我印象不深了,但是 java 的 stream 的啰嗦程度是真的相当之高

collect 就跟画蛇添足一样的感觉,跟泛型一起用太难受了,group 、sort 都是令人发指的反人类

c#的 linq 和 lambda 可以完爆这一项
wolfie
2022-05-12 14:35:42 +08:00
@lisongeee
你家评判一个语言啰不啰嗦是拿代码字符数量比,而不是语法格式来比?
OP 上面异常捕获就是很好的例子。
bequt
2022-05-12 14:35:42 +08:00
感觉 go 后期也会走 try catch 。。。感受真的很明显
lisongeee
2022-05-12 14:37:07 +08:00
@clownpiece 我再额外回复你一条,jetbrains 开发的 kotlin 现在是 google 规定的官方第一开发语言,当然 kotlin 综合生态来比坑定是被 Java 吊锤,你的这些问题应该去问 jetbrains 或者 google 。
pkwenda
2022-05-12 14:39:43 +08:00
哈哈我想到一个:go 和 java 启多线程,和线程通信
lisongeee
2022-05-12 14:40:22 +08:00
@wolfie 咋了,kotlin 的异常处理和 java 一样的啊,而且还有 try catch 表达式,比起 java ,代码只少不多

我打扰一下麻烦请您先去了解 kotlin
silentsky
2022-05-12 14:43:33 +08:00
讨论到最后竟然是在比较字符长短,也是够 low
wolfie
2022-05-12 14:44:46 +08:00
@lisongeee
感觉你上头到了不仔细看上下文。
OP 提的 java 跟 go 的异常捕获对比,就是个很好的对比例子。
lisongeee
2022-05-12 14:46:13 +08:00
@silentsky

人家题主明确说明了《最后来比比 谁的代码少一些。 我敢说,绝对半斤八两,不可能有谁碾压谁的。》

单字符变量名这种不在讨论范围

然后你在这里说 《讨论到最后竟然是在比较字符长短,也是够 low 》

瞎???
lisongeee
2022-05-12 14:48:32 +08:00
@wolfie 你是不是 xia ,我从始自终一直说的是 kotlin 和 java 的语法产生的代码量多少,我不知道 go ,我也没学过 go ,和 go 有关请不要 @我
silentsky
2022-05-12 14:48:38 +08:00
你要是拿题主标题说事,题主可只是拿 java 和 go 比,你干嘛要说 kotlin
xiangyuecn
2022-05-12 14:49:54 +08:00
@Alexliu #16 json 里面取嵌套的对象,不管是 java ,就算是换成 json 的祖宗 js 去读取,一样要判断 null 的情况

js 这样写够简洁了吧:
(((json.obj1||{}).obj2||{}).obj3||{}).abc

换我习惯写的代码:
ObjGet(ObjGet(ObjGet(json,"obj1"), "obj2"),"obj3").get("abc")
// ObjGet(map, key) //封装一下 取出 map 里 key 对应的 map ,如果失败就返回一个全新空的 map

这样写怎么样😂😂😂
silentsky
2022-05-12 14:50:45 +08:00
真的吵不过喷子 优越感太强了
Macolor21
2022-05-12 14:51:22 +08:00
Java 啰嗦的点不是包结构这些,还有一大堆设计模式。

有人吐槽设计模式是 J2EE 出来的产物,不知道“它们”怎么看待 UNIX I/O 的 5 种模型,OSI 7 层模型等。。。

Java 啰嗦的点在于语法糖太少,没有模式匹配、类型推断这些。

它是坏处,也是好处。我承认写 Scala 代码很优雅,但同样我也认为它的学习成本略高。

Java 不断被喷的原因就是,每一行代码都必须清晰的表达用什么类型,做了什么事情,看起来像个啰嗦老太婆,但实际上每一行代码都特别清晰。

所以 Java 代码不复杂,更容易上手,因为代码清晰。

可能一部分人为了显得自己与众不同,高人一等,所以它们倾向于学习成本更高,看起来更简练的语言。

我不认为 Scala ,Groovy, Kotlin 等基于 JVM 的语言是为了此目的而发明出来的。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/852381

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX