关于 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 条回复
superchijinpeng
2022-05-12 13:54:32 +08:00
支持楼主
ohmycorolla
2022-05-12 13:55:26 +08:00
诸君舌战可以休矣 从今讨论到明 从日讨论到夜 能分出个高低贵贱吗 对某种觉得有问题要么不用要么自己想办法去解决 自己吃了这口饭活着还嫌饭骚
kleis
2022-05-12 13:55:53 +08:00
支持楼主
lisongeee
2022-05-12 13:55:58 +08:00
@silentsky

《可以这样 Optional.ofNullable(var).map(o->o.k1()).map(o->o.k2()).orElse(null);》

我的例子是 《 java 就得手动加 if(var!=null&&var.k1!=null&&var.k1.k2!=null){var.k1.k2()}
kotlin 只需要 var?.k1?.k2()》

你这里怎么变成了 k1(),k1 是一个属性,不是方法,还有楼主说了,我们比的是代码量

你这 68 个字符有什么资格碰瓷我 13 个字符???
aragakiyuii
2022-05-12 13:56:37 +08:00
@Alexliu #16 这样应该可以吧
clownpiece
2022-05-12 13:57:01 +08:00
@lisongeee 没用过 kotlin ,假设 setter 里有通知变更之类的逻辑,那我类内部就是只想修改值不想触发变更能不能实现呢
silentsky
2022-05-12 13:57:13 +08:00
kotlin 语法字符确实少,目前生态还不行,讨论当然不是否定彼此,各有优势
haochen2
2022-05-12 13:58:55 +08:00
Go 精髓的 goroutine 、channel 你是提都不提啊,教科书一般的标准库没看过吗
Leviathann
2022-05-12 14:00:07 +08:00
@Joker123456789
另一个分支就是默认的 else null
还可以用 ?: 手动指定另一个分支作为 fallback a?.b()?.c() ?: "fallback“ 前面任意一个为 null 都会直接返回 fallback ,而且这个 fallback 可以是 return

而且 kotlin 的优势不止是这个,单纯的顺序链式取值使用范围并不广泛,kotlin 的优势在于可以和 scope function 联动,
a?.let { function(it) }?.c()?.run { this.someMethod() } ?: falllback
灵活调整 receiver ,这是其他 null safety 语言比不了的
lisongeee
2022-05-12 14:02:45 +08:00
@clownpiece

《没用过 kotlin ,假设 setter 里有通知变更之类的逻辑,那我类内部就是只想修改值不想触发变更能不能实现呢》
违反了封装性,如果到处是你这种写法,那还要什么维护性?
你这个 kotlin 也能实现,我增加一个变量去维护状态,setter 被触发的时候判断一下这个然后不走逻辑,直接赋值就行
但是我从来没有这么做过,我发现我说了优点之后有人好的不谈,专门鸡蛋里挑骨头是吧
silentsky
2022-05-12 14:03:01 +08:00
@lisongeee 方法和属性类似 这并不是重点,你换成属性也可以,只要属性是 public
silentsky
2022-05-12 14:04:16 +08:00
@lisongeee 只是想告诉你 java 也可以用这种链式的一行代码搞定,字符多几个无妨
lisongeee
2022-05-12 14:07:49 +08:00
@clownpiece 没用过 kotlin ,那就请你去了解一下,我之前就是写 java android 的,现在全用 kotlin 了。
我有个同事现在经常知道用 lombok 和 setKey()和 getKey(),我拿一端代码 class A{int k=0;} ; A a = new A(); a.k = 0; 给他看,他竟然认为编译不能通过,理由是没有 setA(0),不能更改 a 的值,哈哈哈,我只是说个别现象,没有地图炮哈
lisongeee
2022-05-12 14:09:42 +08:00
@silentsky
人家题主明确说明了《最后来比比 谁的代码少一些。 我敢说,绝对半斤八两,不可能有谁碾压谁的。》
然后我的评论里是《你这 68 个字符有什么资格碰瓷我 13 个字符???》
然后你在这说《只是想告诉你 java 也可以用这种链式的一行代码搞定,字符多几个无妨》
你是不是瞎???
lisongeee
2022-05-12 14:10:32 +08:00
@silentsky 建议去写汇编,反正字符多几个无妨
Buges
2022-05-12 14:12:57 +08:00
来个最经典的快速排序(无需 inplace )
haskell 代码如下:
qs [] = []
qs (p:xs) = qs [x | x<-xs, x<p] ++ [p] ++ qs [x| x<-xs, x>p]

算法含义一目了然。
你试试 Java 要几行?
clownpiece
2022-05-12 14:17:01 +08:00
@lisongeee 一个类的内部操作还讲封装,真的不想内部绕过去就单独开个类放外面不行吗,总之就是正常写法绕不过去呗
wolfie
2022-05-12 14:17:17 +08:00
果然 java 是个阿猫阿狗都能踩两脚,以字符个数来踩是没想到的。

另一个镜像问题,xml 罗嗦,被 json 完爆。
Oktfolio
2022-05-12 14:17:22 +08:00
@timpaik 谁让你去用 wrapper 了? maven 不就一个 pom.xml 吗? maven 版本兼容性那可太强了。Gradle 也只有 build.gradle settings.gradle 。还没有 vendor 这种东西。
lisongeee
2022-05-12 14:21:27 +08:00
@clownpiece 可以做到,不用原生的 setter 手动写 setKey 和 getKey 即可,

但是 一个类的内部操作还讲封装,人家 kotlin 的封装是字段级别的,设计哲学就不一样,你偏要这么用?

还有我 tm 真是服了,我发现我说了优点之后有人好的不谈,专门鸡蛋里挑骨头是吧

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

老子说的这些优点你们 tm 是一个都不谈哪,真尼玛服了,不去工地抬杠真是可惜了

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

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

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

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

© 2021 V2EX