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

20894 次点击
所在节点    Java
257 条回复
clownpiece
2022-05-12 14:52:09 +08:00
@lisongeee 那就这样呗,假设项目里有 100 个类都是这样 setter 里有通知变更逻辑的,java 和 kotlin 分别按各自的写法写好了,内部也是正常的通过 setter 修改。 现在新来了一个需求 也要新增 100 个类(这些类的名字和上面 100 个几乎一样,很容易混淆),也是有通知变更逻辑,但是他们都需要有内部修改字段不触发变更的逻辑。

那么 java 和 kotlin 来比较一下大家代码的 diff 量?记得要考虑之后的维护
wolfie
2022-05-12 14:52:25 +08:00
@lisongeee
原来你不是不看上下文,是看不懂上下文。
怪不得能说出以字符串多少评价语言啰嗦程度这种话。
AoEiuV020CN
2022-05-12 14:52:52 +08:00
很明显你是把第三库封装起来的行数给无视了,
第三方封装了一千行,你只要一行就能调用,对你来说 java 只要一行就能完成工作,简洁,不啰嗦,
但别人会看到这啰嗦的一千行代码,
lisongeee
2022-05-12 14:54:52 +08:00
@silentsky 那你是否承认 kotlin 语法产生的代码量平均少于 java ?,另外我不应该拿 kotlin 碰瓷高贵的 java 行了吧
Leviathann
2022-05-12 14:55:39 +08:00
@Buges 快排的精髓在于各种优化,而不是这个基本思想,不然的话干嘛不用归并,稳定且上界低
Kaiv2
2022-05-12 14:56:54 +08:00
在 Java 8 之前确实是有点费劲。
场景: 用户选择不同支付方式付款

interface IUserService {
User find();
}

class UserServiceImpl {
User find() {
}
}


interface IOrderService {
void pay();
}
tomolo
2022-05-12 15:01:36 +08:00
一门语言用成死忠,争着争那的,只能说技术视野太狭窄了
lisongeee
2022-05-12 15:03:55 +08:00
@clownpiece

https://stackoverflow.com/questions/61459289/how-to-skip-defined-getters-or-setters-in-kotlin

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

佛了,我说了这么多优点,你是一个都不看呐,光顾着鸡蛋里挑骨头了是吧

和你这种人还有什么讨论的必要呢,你是对的,我是错的,谢谢
Oktfolio
2022-05-12 15:05:33 +08:00
@lisongeee Kotlin 本来就是解决 Java 甜度不够的问题的,OP 很明细不是来杠 Kotlin 的。Kotlin 对我来说存在 Int 兼容,没有无参构造,Data Class 类和成员是 Final 且没法用注解的问题,虽然可以用 noargs 和 allopen 解决,但总觉得不优雅,所以写 Kotlin ,我依旧会用 Java 来写数据实体类。
fgwmlhdkkkw
2022-05-12 15:11:09 +08:00
NIO
lisongeee
2022-05-12 15:11:56 +08:00
我发现某些单一语言的程序员都很固步自封,不肯接受新事物,我现在正式承认我是个傻逼,别来和我讨论了,我承认 java 在语法和生态都是最牛逼的语言,任何一门语言和它比都是垃圾,在它的光芒下都暗淡无光。用 java 的人的生活是完美的,只用 java 的人保持了他对 java 的忠贞,我多么想给这些里面的某些人发一个贞节牌坊。此贴终结,java 完胜。
lisongeee
2022-05-12 15:12:34 +08:00
@Oktfolio 是的,你是对的,我非常赞同你的观点
lisongeee
2022-05-12 15:16:50 +08:00
@xiangyuecn

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

js 其实可以这样写,得益于 js 有 babel 的存在,可以把高版本语法糖转换为低版本语法

json.obj1?.obj2?.obj3?.abc ,

如果你想给一个缺省值,还可以 json.obj1?.obj2?.obj3?.abc ?? defaultValue
ychost
2022-05-12 15:18:22 +08:00
@Alexliu 你这个还真的很好解决,有 JSONPath ,无视空指针,
JSONObject origin = JSONObject.parseObject("...");
boolean isEqual = Objects.equals(JSONPath.eval(origin,"$.data.nation"),"印度尼西亚");
yannxia
2022-05-12 15:18:28 +08:00
@timpaik 因为 go mod 只是一个包管理 ··· Gradle 是一个 Build System ··· 不太好比
jsdi
2022-05-12 15:18:45 +08:00
一看到这种帖子就知道肯定有人要吵起来😐
fredli
2022-05-12 15:19:00 +08:00
还不用函数式,我认为就是落伍了,swift kotlin flutter...
zmal
2022-05-12 15:20:40 +08:00
转自邓草原大佬的说法:

我为什么从 Scala 转回 Java 。1 、Java 已经吸收和实现了大部分类 Scala 的语法,而且还在继续; 2 、Java 的语法虽然没有 Scala 精炼但也更严格些 (也就是没那么灵活),但有成熟 IDE 的帮助,写起来也不慢和少错; 3 、能招到更多的程序员。最后,现在的 Java 已经足够好了,成为各种因素下最均衡的。 ​
Kaiv2
2022-05-12 15:21:55 +08:00
@Kaiv2 想表达多继承没写完就按了下 tab 空格 发出去了 😂
yannxia
2022-05-12 15:22:52 +08:00
@lisongeee 这就是一个月经帖,部分 Java 爱好者 和 Go 爱好者互喷,然后有个轴的人来了开战了,这事情本质上没啥意义,毕竟如果脱糖了,大家没啥区别,爱用啥用啥呗。比较烦那些总是来挑事情的人

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

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

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

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

© 2021 V2EX