Java 的缺点就是啰嗦 Java 的好处也就是这里了吧?
source link: https://www.v2ex.com/t/831086
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
转了语言后 回过头来回忆下以前的做过的项目 感觉到 Java 项目的优点就是结构稳定吧
Spring 提供官方脚手架,自己公司也可以基于脚手架进行定制化开发。 无论是新的项目还是以前老的项目包层次划分统一整齐。
Maven 官方统一固定了文件路径 代码放 src 资源放 resousrce 有人想动这个路径 直接不支持 而且代码 review 直接骂的狗血淋头 我是没见过这年头有人不用 maven 做包管理的
至于业务层次包 大家好像也形成了统一的规范? Api/RPC Service Dao Mdeol 这几层大体结构
有没有同样的感想?
banmuyutian 2 天前
LazyYum 2 天前 2
powerman 2 天前 1
其实有 IDE 自动补全加强 语法啰嗦点真不是坏事,
我看 typescript 跟 ant-design 写的那个 rule 检测表达式,简直就跟鬼画符一样,贼鸡儿难理解
我再让你看看 swift 的不啰嗦 怕不是要把新手往死里坑
https://stackoverflow.com/a/68696283/7250073
https://i.stack.imgur.com/sJs9j.png
golangLover 2 天前 via Android 1
不支持协程,并发吞吐差
只支持一个包名的一个版本,不能共存,时常版本被覆盖
操作复杂 json 想吐
没有原生热更新
没有 async await
Jooooooooo 2 天前
powerman 2 天前 8
sutra 2 天前
只是遵循约定大于配置。
powerman 1 天前
是啊,抽象能力是一回事,有模板跟范型可以进行抽象,提供这种抽象能力无可厚非,
但是其他很多东西真的没必要搞几个回字的写法,像 js 里面的拉曼达表达式有好几种写法,
最后的结果就是造成不熟练这门语言程序员的心智负担,而大部分时候多种写法并没有任何效率提升,
除了带来不必要的心智负担
stackoverflow.com/a/68696283/7250073
以 Swift 为例,我光是看 Swift 这个 UI 声明,就浪费了大半天,其中至少包含了 3 个语法糖
PDX 1 天前 1
可是时间长了发现,这样的语言给每个人施展拳脚的空间实在太大了,每个人都在炫技,这写人完全不考虑读代码的人的感受,可是真正好的代码不应该是清晰明了简单易懂的吗?
据说 C++的作者故意提高了写代码的难度,而 java 却确实降低了写代码的难度。
voidmnwzp 1 天前 via iPhone
pengtdyd 1 天前 2
powerman 1 天前
真的是无语 真不知道为啥 要加这么多语法糖 是为了干啥
kogorou 1 天前
xiao109 1 天前
partystart 1 天前 5
@golangLover
1. 支持多线程就要支持协程?
并发吞吐差 哪个场景?哪个框架对比 直接贴链接
2 操作复杂 json 想吐
官方的简陋 开源的方便
3 没有原生热更新
jdk 提供热更新 不过你要热更新干嘛?直接不发版部署?
4 没有 async await
jdk futureTask 了解一下
5 只支持一个包名一个版本
go 就支持? 我不理解 一个包名多个版本你到底想干嘛?热更新?
还有 java 不负责管理包 目前是 maven 管理
工作中少玩点花活行吗?
gam2046 1 天前 1
其他比如 JavaScript ,来个变量连类型都不确定,c/cpp 的指针 void*又是万能指针,都需要对代码有相当的了解程度才能看懂意图。
reeco 1 天前 via iPhone
shyangs 1 天前
說的像 Java 的 Lambda 只有一種寫法(沒有語法糖). 我一樣可以用 Java 寫出兩種 Lambda.
```
// Java 沒有語法糖
Multiset<Integer> lengths = HashMultiset.create(
FluentIterable.from(strings)
.filter(new Predicate<String>() {
public boolean apply(String string) {
return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string);
}
})
.transform(new Function<String, Integer>() {
public Integer apply(String string) {
return string.length();
}
}));
```
```
// Java8 加語法糖
Multiset<Integer> lengths = HashMultiset.create(
FluentIterable.from(strings)
.filter(string -> CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string))
.transform(string -> string.length()));
```
有多少人喜歡第一種沒有語法糖的 0.0
Leviathann 1 天前 via iPhone 2
如果没学过 那看不懂很正常
我会 kotlin 不会 swift
除了 some 关键字和 getter 省略没见过其他都很清楚啊
如果所有语言语法都要和 java 一样那还发明新语言干嘛
具体说说,
最后一个 lambda 可以写在括号外面,
如果只有一个 lambda 参数直接可以省略小括号
如果 lambda 是无参数的可以省略参数声明和箭头
lambda 最后一行就是返回值
Scala 就有,kotlin 也学的 scala
构造函数不用 new
新语言很多都这样 new 就是多余的 构造函数就是普通的函数 不需要特殊对待
powerman 1 天前
这两种写法 并不会造成太大的理解困难
我抨击的是 swift 跟 js 那种 会造成令人困惑的写法
![]( )
powerman 1 天前
这就是通常程序员挑起语言圣战的起源,
说实话 我根本不想争论这些东西,既然选择要吃 iOS 这个饭,肯定要吃这个屎,全盘接受是没办法的
你提到的那几个省略,除了带来心智负担以及编译器 语法令牌树难以实现外 跟 程序员炫技之外
我看不到任何好处在哪里,节省的那几个字符,在 IDE 补全下,也根本不是问题
ysn2233 1 天前
WispZhan 1 天前
JVM 栈,目前依然还是工程化程度最高的开发工具之一。
powerman 1 天前
var body : some Scene {
WindowGroup { ContentView() }
}
在一个不是很熟悉的 swift 语言的我,看 WindowGroup ContentView 结构体的定义 看了几遍,硬是没理解明白
而且这些语法糖大多是没有提示 也没有解释的,只能去翻语法书,而且提出这个问题的人不仅是我
https://stackoverflow.com/questions/65384567/swiftui-is-this-code-instantiating-a-new-scene-object
dbpe 1 天前
lybcyd 1 天前
jorneyr 1 天前
des 1 天前 via iPhone
如果真的优秀,那为什么 Java 也在加语法糖?
powerman 1 天前
是的,这点我也赞成,但是语法糖这个口子 一旦打开,很多时候就会走向反面,目前 lombok 这样的解决方案也没有那么难懂,而且很多历史原因 不少框架还依赖 java bean 的 getter setter 约定
MakHoCheung 1 天前
其实扩展函数、尾随闭包这些语法很有利于编程语言作为 DSL ,作为类型安全的描述语言代替 XML 、HTML 、SQL
cyspy 1 天前
lisongeee 1 天前
1.我寻思 async await 和 futureTask 有啥关系? async await 是用同步的写法来实现异步回调,简便了开发成本,拒绝回调地狱或者链式回调。async await 就是语法糖而已。
2.只支持一个包名一个版本,如果 [email protected] 依赖 [email protected], [email protected] 依赖 [email protected] 并且 pack_B 的 1.0.0 到 2.0.0 有完全破坏性更改,请问如何同时安装 [email protected] 和 [email protected] ,并保证流畅运行 ?
多版本包共存在 npm/pnpm/yarn 管理下是很常见的,但是 java 的模块机制已经决定很难 多版本共存
powerman 1 天前
第我没觉得这种方式有什么优势在哪里,该用 DSL 应该就发明 DSL 去做,就像 HTML 用来描述结构,CSS 用来描述样式,各施其职,javascript 负责逻辑跟交互
MakHoCheung 1 天前
hello2090 1 天前 via iPhone
powerman 1 天前
MakHoCheung 1 天前
lolizeppelin 1 天前
chniccs 1 天前
Goooler 1 天前
powerman 1 天前
把拉曼达放外面,实在是不敢苟同这种做法,如果有需要,干脆为这种需求定制一种声明式语法都可以。
reeco 1 天前 via iPhone
vate32 1 天前
tt0411 1 天前 1
Leviathann 1 天前
只是占位用的语法元素,如果没歧义的话直接就删掉好了
减少语法噪音,让人专注于逻辑本身
写 js 、ts 的时候总要写一大堆的 () =>,又丑又麻烦 ,然而大括号已经被 object literal 用了没法化简
x940727 1 天前
aicfe 1 天前
charlie21 1 天前
wangtian2020 1 天前 1
ostholz 1 天前
但是再回头写 Java 就太痛苦了.
mosliu 1 天前
idea 花点钱 语法糖省的时间自动提示都出来了。
啰嗦?也可以说是明确吧。
一段代码,写的时候复杂点,但是真的很稳定,易查错,很多问题,从问题找到代码很快就落实了。
心智负担确实少一些
SmiteChow 1 天前
yazinnnn 1 天前
kotlin 因为语法的强大,可以自行写出来很多 java 做不到或者实现很困难的语法糖
与其说看不懂语法糖,不如说不想学新的类库而已
何况用 dsl 写程序就是未来趋势,毕竟广大 spring boy 天天在用的 spring 都有 router function 了
今天写的一点代码
@Bean
fun coRoutes() = coRouter {
GET("/queryLog") { req ->
val ipMono = nullable {
val ip = req.queryParamOrNull("ip").bind()
val vo = loggerService.queryLogByIp(ip)
vo?.let { ok().bodyValue(it) } ?: status(404).build()
}
val codeMono = nullable {
val code = req.queryParamOrNull("code").bind()
val vo = loggerService.queryLogByCode(code)
vo?.let { ok().bodyValue(it) } ?: status(404).build()
}
val badMono = status(400).bodyValue("bad request")
return@GET (ipMono ?: codeMono ?: badMono).awaitSingle()
}
GET("/sse") {
val flux = loggerService.sse().map { it.t2 }
ok().contentType(MediaType.TEXT_EVENT_STREAM)
.body(flux).awaitSingle()
}
}
abcbuzhiming 1 天前 2
Chinsung 1 天前
不支持协程,并发吞吐差 ---------这两者是一回事吗?并发吞吐差体现在哪里?
只支持一个包名的一个版本,不能共存,时常版本被覆盖 -------------我挺好奇哪个语言支持同一个同名类多版本存在。。
操作复杂 json 想吐 --------------如果 JSON 序列化框架你全用 map 接,那大概和你想要的效果差不多,而且 fastjson 封装了一些 json 对象来操作,我觉得便利性还可以
没有原生热更新 ----------------------真的吗真的吗,你要是了解 jvm 的 classloader ,你就会知道这个恰恰是比较优雅的热更新
没有 async await ------------juc 的包是写的不够好吗。。。能看到内部实现的并发工具类难道不比语言直接提供的一个关键字要靠谱点?
littlewing 1 天前
hingbong 1 天前
Trim21 1 天前 via Android
dallaslu 1 天前
sagaxu 1 天前 via Android
yogogo 1 天前
ikas 1 天前
各种神奇语法符号,越怪异,越与众不同越会得到期待与满足.
保持克制,发展核心.而不是乱搞什么语法.
随手说几个上面的问题
1.怎么内部隔离依赖?使用 module,不导出即可
2.java 没有 await,
保持使用线程池,同步代码,没必要大改,因为 java 虚拟线程后,不需要关心太多异步,你可以开上万个线程
3.热更新?看看 tomcat 都可以随时加载,卸载 war,为啥..就算是安卓的官方热更新,那也是提供了一个接口给你 classloader,更不说没有限制的 jvm
4.操作 json 复杂,确实,用 js 就是方便,然后随意点,然后出问题狂骂,谁 tm 加的属性...
java 语言就不改么..推荐看看 jep 列表
比如一个草案:
var query = connection."SELECT * FROM \{table}";
编译后,相当于
connection :
T apply(String template, List<Object> parameters);
你可以同时处理参数名,与参数值,与最终 string
tqccc 1 天前 via Android
zsxeee 1 天前 via Android
GiantHard 1 天前 via Android
```
CollectionType typeReference =
TypeFactory.defaultInstance().constructCollectionType(List.class, Dto.class);
List<Dto> resultDto = objectMapper.readValue(content, typeReference);
```
放到 JS/C# 里面就非常简单了 JSON.parse / JSONConvert.Deserialize
对比起来,Java 真的太啰嗦了。而且这么一坨代码在没有 Copilot 这种人工智能加持下,Idea 能正确的补全出来吗?
micean 1 天前
这种程度的还好不算啰嗦,封装能解决的事。
java 啰嗦主要在于项目里各种人为导致的设计模式的强迫实践,比如一定要写个 interface 再来写 impl ,给参数建各种 class ,注解流行之前还要写各种 xml 等等
我直接赞美 ts 还有人说喜欢建各种 class 的形式 https://www.v2ex.com/t/830210
所以萝卜白菜各有所爱吧……
MakHoCheung 1 天前
Unicorns96 1 天前
yazinnnn 1 天前
其次,graal 可以让你的程序内存减小很多,起动速度快两个量级,适合云场景,但是如果长时间运行,aot 性能不如 jit ,内存也会暴涨
zxjunz 1 天前 via Android
kur0d3s 1 天前
```
List<Object> objs = objectMapper.readValue(json, new TypeReference<List<Object>>(){});
```
觉得 new 太丑,自己封装一下
yazinnnn 1 天前
micean 1 天前
不能一棒子打死,好坏分开看吧。
lombok 也好,代码生成器也好,javaer 也一直在努力减少啰嗦这个问题。
kotlin 虽然写的很爽,但是看旧代码真的要比 java 更集中注意力才行
exceldream 1 天前 via Android
yaphets666 23 小时 17 分钟前
stockmaster 22 小时 47 分钟前
Leviathann 22 小时 21 分钟前 via iPhone
akira 21 小时 27 分钟前
dany813 15 小时 45 分钟前
wobuhuicode 13 小时 40 分钟前
Bingchunmoli 13 小时 24 分钟前
FrankHB 9 小时 50 分钟前
好处:爹是 Oracle 。
相比之下技术特征很大程度上可以跳过……
都 2022 了……
https://bugs.openjdk.java.net/browse/JDK-4511638
Schubfach 的实现怕是到处跑了几年了,然而大概没几个知道原作者的 Java 实现和 paper 写到 v4 了吧……
msg7086 4 小时 34 分钟前
同样的 Java 工程师岗位,我是写 Ruby 的,之前新来的一个哥们是写 C++的,我们都在做 Java 项目,没压力。
坏处是没法写得魔法和简洁。
我们组之前用 Java 7 ,连 lambda 都没有,写 JUnit 做个 mock ,一个 mock 就是六七行,一个 test 文件随便小几百行,满屏的 mock 加上匿名类。循环都写成循环,连个存档点都没法好好做。
现在好不容易上了 Java 8 了,至少能写写 lambda 了,mock 也可以一行干一个方法了,循环也可以重写成 stream 了,开发轻松了不少,但和写 Ruby 比起来开发效率还是差了太多了。Ruby 项目我一星期干了一个生产系统出来,Rails+VueJS 三天时间做了一个 POC ,但是 Java 我做一个只有 1000 行左右代码的 story 花了差不多半个月,这还是只做了 Unit testing ,没做 Acceptance testing 的情况。
如果老板不追着赶工的话,写 Java 还是挺舒服的,摸鱼摸个爽。追着赶工那就是地狱了。
chenshun00 2 小时 43 分钟前
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK