V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
GotKiCry
V2EX  ›  程序员

好奇 Java 味是什么味

  •  
  •   GotKiCry · 2025 年 3 月 14 日 · 7162 次点击
    这是一个创建于 307 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我把 Time 处理相关的写到 TimeUtil 里面,File 相关写到 FileUtil 里面。这样算 Java 味吗。
    一直是在用 Java 和 Kotlin 写 Android 代码,写 Python 脚本如果是长期项目我是尽量会把代码抽离出来,不知道这样的操作是不是 Java 味太重了🤔🤔🤔
    70 条回复    2025-03-17 17:17:19 +08:00
    mahaoqu
        1
    mahaoqu  
       2025 年 3 月 14 日   ❤️ 10
    大概就这种:

    public interface Subject {
    public void attach(Observer observer);
    public void detach(Observer observer);
    public void notifyObservers();
    }

    public interface Observer {
    public void update(Subject subject);
    }

    public class HelloWorldSubject implements Subject {

    private ArrayList<Observer> observers;
    private String str;

    public HelloWorldSubject() {
    super();

    observers = new ArrayList<Observer>();
    }

    public void attach(Observer observer) {
    observers.add(observer);
    }

    public void detach(Observer observer) {
    observers.remove(observer);
    }

    public void notifyObservers() {
    Iterator<Observer> iter = observers.iterator();

    while (iter.hasNext()) {
    Observer observer = iter.next();
    observer.update(this);
    }
    }

    public String getStr() {
    return str;
    }

    public void setStr(String str) {
    this.str = str;
    notifyObservers();
    }
    }

    public class HelloWorldObserver implements Observer {

    public void update(Subject subject) {
    HelloWorldSubject sub = (HelloWorldSubject)subject;
    System.out.println(sub.getStr());
    }
    }

    public interface Command {
    void execute();
    }

    public class HelloWorldCommand implements Command {

    private HelloWorldSubject subject;

    public HelloWorldCommand(Subject subject) {
    super();

    this.subject = (HelloWorldSubject)subject;
    }

    public void execute() {
    subject.setStr("hello world");
    }
    }

    public interface AbstractFactory {
    public Subject createSubject();
    public Observer createObserver();
    public Command createCommand(Subject subject);
    }

    public class HelloWorldFactory implements AbstractFactory {

    public Subject createSubject() {
    return new HelloWorldSubject();
    }

    public Observer createObserver() {
    return new HelloWorldObserver();
    }

    public Command createCommand(Subject subject) {
    return new HelloWorldCommand(subject);
    }
    }

    public class FactoryMakerSingleton {

    private static FactoryMakerSingleton instance = null;
    private AbstractFactory factory;

    private FactoryMakerSingleton() {
    factory = new HelloWorldFactory();
    }

    public static synchronized FactoryMakerSingleton getInstance() {
    if (instance == null) {
    instance = new FactoryMakerSingleton();
    }

    return instance;
    }

    public AbstractFactory getFactory() {
    return factory;
    }
    }

    public class AbuseDesignPatterns {

    public static void main(String[] args) {
    AbstractFactory factory = FactoryMakerSingleton.getInstance().getFactory();

    Subject subject = factory.createSubject();
    subject.attach(factory.createObserver());

    Command command = factory.createCommand(subject);

    command.execute();
    }
    }
    NessajCN
        2
    NessajCN  
       2025 年 3 月 14 日 via Android
    Jvav 味儿比二次元味儿都冲
    如果你还需要别人来告诉你啥是 Jvav 味儿而不能靠自己一眼分辨,
    那说明你自己早就腌制入味了

    就好像抽烟的人旁人一闻可知,他自己却总是自我感觉良好
    GotKiCry
        3
    GotKiCry  
    OP
       2025 年 3 月 14 日
    @NessajCN emmm 。主要我接触其他语言比较少,除了 Java 相关只接触过 Python 和稍微学习过 Go
    rockddd
        4
    rockddd  
       2025 年 3 月 14 日   ❤️ 23
    你糊涂呀,这么好的话题不在上班时间发。
    sagaxu
        5
    sagaxu  
       2025 年 3 月 14 日   ❤️ 5
    读取某个文件,正常味道的语言
    open().read()
    fd = open(...); read(fd, ...);
    File(...).readAll()
    ioutils.read(...)

    Java 味儿,来,先学一下 reader, buffered reader, inputstream, buffered input stream ,然后再研究用哪个,中间包的用完了该不该 close 。

    设计时就确定只有一个 implementation ,也要强行定义 interface ,还要定义一堆一模一样的 vo/dto...,不要问,问就是业界规范,大家都这么干。
    GotKiCry
        6
    GotKiCry  
    OP
       2025 年 3 月 14 日
    @wxw752 还在上班中,只是快下班了扫了一眼论坛😂
    GotKiCry
        7
    GotKiCry  
    OP
       2025 年 3 月 14 日
    @sagaxu Java 这些 Reader Stream 我自己也难绷
    dranfree
        8
    dranfree  
       2025 年 3 月 14 日 via Android
    Java 味就是啰嗦,代码写起来像老太太的裹脚布,又臭又长……
    murmur
        9
    murmur  
       2025 年 3 月 14 日
    @sagaxu java 也有 hutool ,别黑了,java 味就是标准的 controller bean service ,真落在业务逻辑,都是调库,谁手搓原生代码啊
    murmur
        10
    murmur  
       2025 年 3 月 14 日
    @dranfree 跟 objc 比 java 都是弟弟

    java

    person.fuck(personb, true, true)

    obj-c

    [person haveSexualIntercorseWith]:personB healthCheckBeforeYouDid: YES useSomethingToProtectYourSafety: YES

    比又长又臭 java 真不配
    fulln
        11
    fulln  
       2025 年 3 月 14 日
    不懂,说分多个文件 java 味十足的, 要是看了「重构」 这个本书, 那不得气得跳脚...
    cvooc
        12
    cvooc  
       2025 年 3 月 14 日   ❤️ 9
    java 味 --> 指一个简单 crud 先来个 dto/vo/cotroller/service/serviceimpl/dao/daoimpl/mapper/mapper.xml 大礼包
    debuggerx
        13
    debuggerx  
       2025 年 3 月 14 日
    @murmur 这不叫味儿 这是 objc 本身语法和命名规范就这样
    aboutier
        14
    aboutier  
       2025 年 3 月 14 日
    huigeer
        15
    huigeer  
       2025 年 3 月 14 日
    居然没有人说 lamuda 表达式,
    fox0001
        16
    fox0001  
       2025 年 3 月 14 日 via Android
    就是代码繁琐
    aaniao002
        17
    aaniao002  
       2025 年 3 月 14 日 via Android   ❤️ 1
    哪门语言需要 ide 来自动生成代码。
    lisongeee
        18
    lisongeee  
       2025 年 3 月 14 日   ❤️ 1
    搬一下我 1 坤年之前一个回复 https://v2ex.com/t/872064#r_11975008

    最 java 味应该是一个项目里写 99% 都用不到的 额外的 空的 一堆什么也不干的 setter/getter
    debuggerx
        19
    debuggerx  
       2025 年 3 月 14 日   ❤️ 5
    我受不了的 java 味:
    1. 无意义的抽象和继承,简单问题复杂化,自以为是预留扩展性,然而绝大多数情况下非但用不到,反而是增加了复杂度和项目维护成本(当然有人把这种操作当作防御式编程增加自身不可替代性,实际结果往往不过是叠屎山)
    2. 滥用多线程。有些人似乎觉得 java 不写多线程很 low ,结果滥用多线程,没必要的时候也要强上,然而很多 javaer 实际的心智水平根本玩不转多线程,要么自以为提高效率的多线程实际比一般写法还慢,要么生产出现线程安全甚至死锁,纯纯又菜又爱玩自讨苦吃
    3. 滥用架构。web 服务必上 redis ,设计必须拆成微服务,看似追求最近技术方案,然而却抱着 mysql5.7 、centos6 不放,整天还研究 java1.8 的 jvm 调参,就不想想守着这堆破烂搞架构的路子能走多远。
    4. 把一些 java 本身缺陷导致的东西当作唯一正确性去要求别的语言和框架,比如语法贫瘠导致的各种设计模式,比如灵活性不足而不得不使用的反射技术,比如落后的线程模型催生的一堆教条,很多新的语言和框架从本身就已经解决或者规避了,有些 javaer 用的时候却还习惯性往上靠,靠的不对劲了还觉得是那些语言和框架不行,反正就是 java 祖宗之法不可变……
    lisongeee
        20
    lisongeee  
       2025 年 3 月 14 日
    关于我在 #18 发的评论的佐证评论 https://v2ex.com/t/872064?p=2#r_11976203
    zwzwzwzwzxt
        21
    zwzwzwzwzxt  
       2025 年 3 月 14 日   ❤️ 9
    这样的:

    jeesk
        22
    jeesk  
       2025 年 3 月 14 日 via Android   ❤️ 1
    @fulln

    你把每个 class 都写一个文件,有人要骂你。
    如果你把一个文件写了多个 class 也有人要骂你。

    我就问问怎么才不挨骂?
    sthwrong
        23
    sthwrong  
       2025 年 3 月 14 日
    特性啊,啰嗦啊,套娃啊什么的都好改,毕竟也不是没改。最恶心的其实是守旧,他发任他发,我用 java8.
    buffzty
        24
    buffzty  
       2025 年 3 月 14 日
    @mahaoqu 你是 javer 届的叛徒, 罚你以后 Xmx16g
    mmdsun
        25
    mmdsun  
       2025 年 3 月 14 日
    上次我看到这词的时候还是吐槽说:go 语言 sdk java 味:
    https://www.v2ex.com/t/1036033
    iorilu
        26
    iorilu  
       2025 年 3 月 14 日   ❤️ 1
    就是一看几十个文件, 实际上核心代码就几十行
    NessajCN
        27
    NessajCN  
       2025 年 3 月 14 日 via Android
    对了,想了解啥叫其他语言里透出 jvav 味儿的可以去看看 NestJS
    体会一下啥叫扑鼻的 Jvav 恶臭
    1daydayde
        28
    1daydayde  
       2025 年 3 月 14 日
    没喝过咖啡吗?当然是咖啡味了 (doge
    Lightbright
        29
    Lightbright  
       2025 年 3 月 14 日 via Android   ❤️ 6
    用 ai 都更浪费 token
    zed1018
        30
    zed1018  
       2025 年 3 月 14 日
    @zwzwzwzwzxt 长命名不是 OC 味吗
    pikko
        31
    pikko  
       2025 年 3 月 14 日
    @zwzwzwzwzxt #21 这个类名比我命还长
    kneo
        32
    kneo  
       2025 年 3 月 14 日 via Android   ❤️ 2
    @pikko 别说不吉利的话。
    gowk
        33
    gowk  
       2025 年 3 月 14 日   ❤️ 1
    httpDispatcherDecoratorHandlerAdapterStrategyConfigObserverFactory

    https://x.com/cholf5/status/1900033963290448223
    ikas
        34
    ikas  
       2025 年 3 月 14 日
    味道在于人,就算 java 现在也不需要什么 FileUtils,TimeUtil,都是什么年代的了..nio 的 Files,time 的 Instant 等不够用?
    ajaxfunction
        35
    ajaxfunction  
       2025 年 3 月 14 日
    典型的又臭又长。 虽然是 ide 可以生成,getter setter 一大堆。
    其他语言 30 行代码就够,他的 100 行
    sagaxu
        36
    sagaxu  
       2025 年 3 月 14 日
    @murmur Java 有各种 XXTool 是 JVM 生态好,不是 JRE 标准库好,主流语言有几个连 JSON 库都要第三方提供的?
    irrigate2554
        37
    irrigate2554  
       2025 年 3 月 14 日
    java 确实有味,ide 自动生成的代码能占 80%
    james122333
        38
    james122333  
       2025 年 3 月 15 日 via Android
    就是过度封装 一串代码内只有少数几行真正起关键作用 当然现在都不只 java 这样...
    这样封装他们觉得很灵活 会以生物学角度看待 oop
    但就我来看就是奇美拉 透过继承等特性合成对象 这一串看起来是灵活了 看来是个战力高的生物 但很难与其它类相容 不是不行 但得绞尽脑汁 必需得经过生物演化痛苦的过程
    java 还是可以写不那么 oop 类与命名空间我觉得雷同
    但很少人写的简洁
    AmericanExpress
        39
    AmericanExpress  
       2025 年 3 月 15 日
    讲道理这是菜味不是 java 味
    levelworm
        40
    levelworm  
       2025 年 3 月 15 日 via Android
    无穷多的 getter setter
    facebook47
        41
    facebook47  
       2025 年 3 月 15 日 via Android
    不会用注解🤣🤣🤣
    cooltechbs
        42
    cooltechbs  
       2025 年 3 月 15 日 via Android
    和 Go 相反的味儿
    badreamm
        43
    badreamm  
       2025 年 3 月 15 日   ❤️ 1
    java 味就是老人味
    mayli
        44
    mayli  
       2025 年 3 月 15 日
    File 相关有啥可以写到 util 里的?
    不就一行就完事了 open(xxx).read()
    最多 with open(..) as fd: ...
    或者 pathlib: Path(..).read_text()
    就真没必要一堆 util util 的,大概率是垃圾无效代码了。

    当然,对于 java 来说,都不算垃圾。
    wyntalgeer
        45
    wyntalgeer  
       2025 年 3 月 15 日
    过度封装过度设计
    就这八个字都定论多少年了,有什么好讨论的,铜板拿去拿去
    Loku
        46
    Loku  
       2025 年 3 月 15 日
    @sagaxu 人的问题,jdk 版本一直都不换新

    //Since: 9
    new FileInputStream(new File("")).readAllBytes()
    guotie
        47
    guotie  
       2025 年 3 月 15 日
    get
    set
    vo
    bo
    ....
    twoyuan
        48
    twoyuan  
       2025 年 3 月 15 日
    《 20 亿种设计模式》
    Biem
        49
    Biem  
       2025 年 3 月 15 日
    Java 味就是 Jvav 味,Jvav 味就是 AV 味,AV 味就是海的味道,而海中又有 Java 岛,Java 岛产 Java 咖啡,因此 Java 味就是 Java 咖啡的味。
    Tanix2
        50
    Tanix2  
       2025 年 3 月 15 日   ❤️ 1
    老太婆的裹脚布——又臭又长
    maix27
        51
    maix27  
       2025 年 3 月 15 日
    不写这个,据发小所言,应该是班味。
    Shaar
        52
    Shaar  
       2025 年 3 月 15 日
    我记得大学先学了 c 和 c++,后来有一门 java 课,刚学的时候发现很多名字都那么长,
    就像楼上贴到的 public class HelloWorldCommand implements Command ,
    然后我就很抗拒,感觉看不顺眼,后来就没怎么学.
    不知道方法名字很长是不是 java 味
    kome
        53
    kome  
       2025 年 3 月 15 日 via iPhone
    曾经,甲方装了个脚本到我们运维的主机上(8G 内存),具体的功能就是操作 chrome 浏览器,获取一些监控数据,然后调用短信接口发短信。
    就是一个脚本性质的程序,然后用 springboot 写的,内存占用 800MB ,Java8 。
    曾经在跟车友(前端)爬山的时候,他吐槽前端一个框架一个写法,个个不一样,一个功能一片轮子。
    我:“那你应该写 Java ,springboot 大一统,都不知道 Java 程序员离开 springboot 还会不会写代码写工程。”
    个人感觉就是 Java 对资源的无止境的贪婪获取,各种封装各种抽象,不论要解决的问题是大是小,先把这一套来一遍。
    leonshaw
        54
    leonshaw  
       2025 年 3 月 15 日 via Android
    把 SQL 写到方法名里
    Rat3
        55
    Rat3  
       2025 年 3 月 15 日   ❤️ 1
    要不是 Java 能帮我糊口,我一定跟你们一起唾弃
    IamUNICODE
        57
    IamUNICODE  
       2025 年 3 月 15 日
    换个语言都能又臭又长,还不能说的味道
    yooomu
        58
    yooomu  
       2025 年 3 月 15 日
    其实没什么东西叫 java 味,楼上说的 getter setter 、滥用设计模式,其他语言也有,只不过加上了语法糖,看起来没那么一坨。只是因为低水平的 java 开发者过多形成的鄙视链罢了
    yooomu
        59
    yooomu  
       2025 年 3 月 15 日   ❤️ 1
    @yooomu #58 java 代码看起来又臭又长,原因还是 java 历史包袱重,对于语法糖和特性的添加过于克制,还有最关键的万年 java8 。为了代码扩展性,不得不一层套一层,用一大堆设计模式。要是 java 能支持扩展方法那我觉得就不会有这种一层套一层的情况出现了。
    duzhuo
        60
    duzhuo  
       2025 年 3 月 15 日
    @mahaoqu 太抽象了 太有味了
    murmur
        61
    murmur  
       2025 年 3 月 15 日
    @sagaxu javax.json ,你好,有的,但是不是开源 java ,是甲骨文 java
    xuld
        62
    xuld  
       2025 年 3 月 15 日
    @yooomu "楼上说的 getter setter ,只不过加上了语法糖,看起来没那么一坨",这句是不对的,

    举个例子,下面的代码,有 java 味的人看了浑身不自在:

    class A {
    public int a = 0;
    }

    一定要写成这样,才舒服:

    class A {
    private int a = 0;
    public int getA() {
    return a;
    }
    public void setA(int a) {
    this.a = a;
    }
    }
    PTLin
        63
    PTLin  
       2025 年 3 月 15 日
    @xuld 你这个例子让我想起来我看过的一本算法书,那本书用的语言是 python ,但是还是写了和你代码中一样的 getter setter ,完全不知道 python 里还有 @property
    yooomu
        64
    yooomu  
       2025 年 3 月 16 日 via iPhone
    @xuld getter setter 绝对是有好处的,如果有语法层面的支持,像 c#和 kotlin 一样优雅,就没人反感了。高版本的 java 已经引入了 record ,解决了这个问题,然而归根到底还是万年 java8 导致的
    xuld
        65
    xuld  
       2025 年 3 月 16 日
    @yooomu 有好处不代表就要到处用。

    药有没有好处?你天天吃吗?

    javaer 总是用“这样才专业,这样能避免 XXXX 问题,这就是 java 生态”这样的方式回答问题

    确实,这样能避免 XXXX 问题,但问题是过去、现在、未来都不会出现 XXXX 问题。
    或者,如果 XXXX 问题真的出现了,再改代码也来得及
    yooomu
        66
    yooomu  
       2025 年 3 月 16 日 via iPhone
    @xuld 如果有好处,而且使用成本极低,那为什么不用。还是我强调的,如果 java8 和 kotlin 的属性一样优雅,那就没人黑 getter 和 setter 这种冗余设计。更何况谁不知道 getter setter 恶心,所以才有 lombok 这种工具
    beldon
        67
    beldon  
       2025 年 3 月 17 日
    @debuggerx 我排查过生产 OOM ,比较过分的是一个大任务过来就创建一个线程池去拆任务,结果出问题时一堆线程池。
    GotKiCry
        68
    GotKiCry  
    OP
       2025 年 3 月 17 日
    @huigeer 我觉得 lambda 挺优秀的,不过很多老程序员不喜欢
    lyxxxh2
        69
    lyxxxh2  
       2025 年 3 月 17 日
    @retrocode
    你让我想起之前被支配的恐惧了。
    通过 ai,终于找到那个框架了: https://apiato.io/docs/architecture-concepts/porto
    返回一个简单的列表: route -> controller -> task -> action -> service -> repository -> model -> transformer ...
    vcbal
        70
    vcbal  
       2025 年 3 月 17 日
    老奶奶的袜子味,又臭又长,没有灵性
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   3167 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 13:53 · PVG 21:53 · LAX 05:53 · JFK 08:53
    ♥ Do have faith in what you're doing.