关于 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 在 丰富的生态+强大官方库的 加持下,可以更快完成。

20890 次点击
所在节点    Java
257 条回复
Joker123456789
2022-05-12 12:54:45 +08:00
@Alexliu 你是想要我用 jackson 还是 fastjson 还是 gson ? 然后麻烦你用你喜欢的语言 也写一个版本。
FungKao
2022-05-12 12:55:10 +08:00
@xgfan C# 10 真的就可以在 Program.cs 文件中写一行就可以了。语法糖,编译器会帮你把剩下的代码补上。
Joker123456789
2022-05-12 12:55:23 +08:00
@ColinZeb 请具体说明
Alexliu
2022-05-12 12:56:42 +08:00
@Joker123456789 用哪个都无所谓,麻烦的地方在于解析成对象或者 JsonObj 之后每一层都需要判断
knightdf
2022-05-12 12:56:47 +08:00
骂 Java 已经变成 zz 正确,不然怎么凸显他们牛逼呢
ColinZeb
2022-05-12 12:56:57 +08:00
https://v2ex.com/t/837916
楼主看看 java 实现这样的功能需要写多少代码
silentsky
2022-05-12 12:57:52 +08:00
那些喷 java 的,其实对 java 只是一知半解,习惯了。语法上 java 其实没什么可挑剔的
ColinZeb
2022-05-12 13:01:09 +08:00
或者看看 kotlin 、scala 、groovy 的说明书 他们为什么要创造这些语言 这些语言较 java 有什么区别
6IbA2bj5ip3tK49j
2022-05-12 13:02:17 +08:00
@zacharyjia 我想不到‘c# top-level’这个在生产上能用在哪儿。
java 写成 jshell script 也是一行,也能直接运行。
```
jshell jscript.jsh
```
顺便提一下,连 python 都是推荐写 if __name__ == "__main__" 的
hhjswf
2022-05-12 13:02:23 +08:00
@Alexliu optional...
DOLLOR
2022-05-12 13:03:54 +08:00
哈哈,平时在前端的主题下都在群嘲前端娱乐圈呢,结果后端领域不也一样嘛?🤣🤣
AllenHua
2022-05-12 13:09:27 +08:00
我首先就给楼主这种认真钻研、客观中立的精神一个赞
Lancer777
2022-05-12 13:16:01 +08:00
@ColinZeb 你说的这些 Go 也没有啊……而且大部分 Java 程序员本来就知道没法和 C#比语法糖啊,但是 Go 程序员来喷什么,配吗?
1rror
2022-05-12 13:20:56 +08:00
想看到 C#过来 battle 。
nba2k9
2022-05-12 13:25:16 +08:00
想不到多一些语法糖也能也贬低 Java
LotusChuan
2022-05-12 13:25:34 +08:00
一直感觉语言之间打仗没什么意义,一般语言想上手学个 30%就够用了,边写边查,总共也用不了多少时间,op 发这种主题也算无奈了。有这空发动语言之间宗教战争还不如看点底层点的知识,语言这种顶层的东西就算口水仗打赢了也没什么成就感,输了的反而心里还难受,何必呢。
lisongeee
2022-05-12 13:31:18 +08:00
《最后来比比 谁的代码少一些。 我敢说,绝对半斤八两,不可能有谁碾压谁的。》
你认真的? kotlin 表示在代码量这块碾压 java 是妥妥的
Maboroshii
2022-05-12 13:31:43 +08:00
可能是人啰嗦而不是语言啰嗦? 中位数太低的原因? 说着就变成了地图炮哎。 反正我是见过的
fantastM
2022-05-12 13:33:40 +08:00
Java 的语法确实不算啰嗦,但是用 Java 的人就不一定了,赞同 https://www.v2ex.com/t/821297?p=1#r_11162935
Joker123456789
2022-05-12 13:34:00 +08:00
@ColinZeb

我突然想到一个例子。比如这两种写法

if(xxx != null){
xxx.ss();
}

--------------------------------------------------------------------------------

xxx?.ss();

但是有一个问题,如果 xxx 为空 肯定需要有后续的业务处理的,如果 xxx 为空,导致 ss 没法正常调用,就说明业务没有正常进行,必然需要处理为空的时候。 实际会这样。

if(xxx == null){
处理问题
return ;
}

xxx.ss();

---------------------------------------------------------------------------------

Object result = xxx?.ss();

if(result == null){
处理问题
return ;
}

我不确定 语法有没有问题,但是这不是重点,我想说的是,如果出现了需要 if 的时候,必然不可能只有一个分支,既然有两个分支,那你在偷懒其中一个分支的时候,另一个分支是偷不了的。

还有你说的,属性,泛型,请具体阐述。

至于语言为什么会出现? 我就不多说了,肯定是有差异的,各有优劣。 没必要觉得谁碾压谁。

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

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

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

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

© 2021 V2EX