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

19914 次点击
所在节点    Java
257 条回复
BeautifulSoap
2022-05-12 12:22:04 +08:00
目测要战起来,最近在学 Kotlin 的表示前排吃瓜
iyear
2022-05-12 12:29:05 +08:00
百楼预定🤣
chengyiqun
2022-05-12 12:30:36 +08:00
我个人也是觉得 java 好用的, 至少在写大型项目的时候, 我优先考虑 java.
考虑性能或者写小工具,爬虫, 才考虑用其他语言.
frisktale
2022-05-12 12:31:37 +08:00
需求:在控制台输出 "Hello World"
C# 一行 https://gist.github.com/frisktale/abbe6536b0adbce34067f63643cab97f
java ?行
Goooooos
2022-05-12 12:32:08 +08:00
没必要没必要,爱喷 java 的人,你说再多他也能找到要喷的点
vchroc
2022-05-12 12:33:05 +08:00
go 糖太少,味儿苦啊
chengyiqun
2022-05-12 12:34:37 +08:00
@frisktale C#我承认比 java 优秀, 奈何用的人少很多, 生态没 java 丰富
chengyiqun
2022-05-12 12:35:11 +08:00
@frisktale 我上大学的时候, 本来也想学 C#的, 后来还是学 java 了.
chengyiqun
2022-05-12 12:41:56 +08:00
@frisktale 你省略了 class 包, main 函数
实际上 java 省略这些, 也是一行啊
[url=https://imgtu.com/i/OwzCkQ][img]https://s1.ax1x.com/2022/05/12/OwzCkQ.png[/img][/url]
dreamlike
2022-05-12 12:44:10 +08:00
java 的最大意义还得是 jvm ,真写代码不如 kotlin 表达力,kotlin dsl 多好。
如果只是写 spring 这种业务脚本,用啥都一样
Joker123456789
2022-05-12 12:44:18 +08:00
@frisktale System.out.print("Hello word"); 你能出点高端的吗? 就知道打印 hello Word ?
zacharyjia
2022-05-12 12:46:40 +08:00
@Joker123456789 他说的是 c#的 top-level 程序,可以跟脚本语言一样,不用类和方法什么的,直接写了就运行。印象中 java 好像确实不行
xgfan
2022-05-12 12:48:38 +08:00
@frisktale C#天天就写 hello world 吗?

```
public class X{
public static void main(String[] args){
System.out.println("Hello World");
}
}
```
Java 是 5 行,这种对比屁用没有,别的语言可以说 Java 分层繁琐啥的,C#也配?
而且,我搜了一下,C#正常也不是一行啊。
https://www.programiz.com/csharp-programming/hello-world
我没写过 C#,你确定你不是拿着 repl 语句在对比?如果是 repl 语句,那 java 也是一句。
me221
2022-05-12 12:49:12 +08:00
吵赢了能加工资吗
zacharyjia
2022-05-12 12:50:36 +08:00
@xgfan 参考我上面的评论,关键词 'c# top-level' 可以搜一下。人家说的确实是对的,但是意义多大不好评论
Alexliu
2022-05-12 12:51:10 +08:00
{
"code":200,
"message":"success",
"data":{
"person":{
"meta":{
"address":{
"nation":"印度尼西亚"
},
"custom":{
"key":"value"
}
},
"name":"王德发",
"age":16
},
"role":"teacher"
}
}

请用 Java 解析以上 JSON ,并判断用户 nation 是否为印度尼西亚,返回结果的每一层都有可能为空。。。。
kujio
2022-05-12 12:52:07 +08:00
想看 java 和 kotlin
ration
2022-05-12 12:53:08 +08:00
具体还是看看泛型的实现,内存管理,线程模型这些。比语法糖的话我投 C#。目录差不多长就可以了,更多的是一个观感问题,其实我感觉太长的目录也影响性能,虽然有时候可忽略不计。
ColinZeb
2022-05-12 12:53:50 +08:00
没想到 java 也有洗白的一天
属性不提?
泛型不提?
模式匹配不提?
如果 java 和其他与语言大差不差,不知道出来那么多 jvm 衍生语言是干嘛的
xgfan
2022-05-12 12:54:32 +08:00
Java 的啰嗦不是语言层面的,而是有点玄学的“社区 /文化”层面。
当开始使用 Java 了,就会习惯性分一堆层,三层三层又三层,定义一堆长的差不多的 DTO/VO/xxO 。

让用 Java 社区的做法去用 Kotlin ,就会发现,哪怕是语法糖甜到齁的 kotlin ,在不大范围重构的前提下重写 Java 项目,也只能节省 10%-20%左右的代码行数。

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

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

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

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

© 2021 V2EX