V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
XinLake
V2EX  ›  Java

如何优化这段代码更加优雅

  •  
  •   XinLake · 2018-04-02 13:20:27 +08:00 · 4846 次点击
    这是一个创建于 2459 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个函数输入一个 file,返回 file 的信息。long[0] 是长度,long[1] 是最后修改。不想定义其他的 class,如何更加优雅的返回信息?

    private @Nullable long[] getFileInfo(File file) {
        try {
            long length = file.length();
            long modified = file.lastModified();
            return new long[]{length, modified};
        } catch (Exception e) {
            return null;
        }
    }
    
    21 条回复    2018-04-03 18:29:12 +08:00
    iamaprin
        1
    iamaprin  
       2018-04-02 13:56:57 +08:00 via Android   ❤️ 1
    将长度及最后修改时间包装为一个对象类,比如 FileInfo,易于拓展,比如以后需要返回文件名称,使用 index 标识维护麻烦。方法不处理异常,建议直接抛出或者重新封装为自定义异常抛出
    whileFalse
        2
    whileFalse  
       2018-04-02 14:55:02 +08:00
    lz 这写法好像 c...
    raiz
        3
    raiz  
       2018-04-02 15:19:49 +08:00   ❤️ 1
    这异常只有 null 异常吧, 直接判断好了,别那么依赖异常机制吧。
    gen900
        4
    gen900  
       2018-04-02 16:16:43 +08:00
    返回 对象啊,返回数组?这谁教的
    AlisaDestiny
        5
    AlisaDestiny  
       2018-04-02 17:08:12 +08:00   ❤️ 3
    你这样还不如不要这个方法。
    cysroad
        6
    cysroad  
       2018-04-02 17:19:41 +08:00   ❤️ 2
    File 类既然有 length()和 lastModified() 方法,为什么还要额外写一个函数来使用
    返回值还放在一个数组里面用下标访问
    异常处理也有问题,为什么不放在这个方法外来判断 file 对象的 null,而是捕获异常 ,用返回值判断
    sudoz
        7
    sudoz  
       2018-04-02 17:35:27 +08:00
    @whileFalse 别黑 C 哈哈
    zcm3579
        8
    zcm3579  
       2018-04-02 17:46:42 +08:00   ❤️ 1
    总得有个对象包着 ,你这样还得记着每个索引对应哪个变量
    Miy4mori
        9
    Miy4mori  
       2018-04-02 18:02:13 +08:00
    File 对象里就包含你要的 length 和 lastModified,写个函数再组装成数组通过下标访问是什么操作?
    yippees
        10
    yippees  
       2018-04-02 19:26:52 +08:00
    更加优雅?
    眼拙没看出原来优雅在哪里
    XinLake
        11
    XinLake  
    OP
       2018-04-02 20:56:58 +08:00
    @raiz @cysroad
    异常开销大么?

    @gen900 @zcm3579 @Miy4mori @yippees
    这是临时敲的一段,就看看回复
    murmur
        12
    murmur  
       2018-04-02 20:58:40 +08:00
    单纯为了省行数可以新建个对象 给他个 2 个参数的构造函数就行了
    不过单纯为了省代码而省代码没意思
    对象的好处就是扩展起来容易 尤其是 java 这种语法比较严的
    XinLake
        13
    XinLake  
    OP
       2018-04-02 20:59:29 +08:00
    @whileFalse
    哈哈,这是 java,c 风格的括号不是这么打的吧
    honeycomb
        14
    honeycomb  
       2018-04-02 21:40:43 +08:00   ❤️ 1
    @XinLake

    异常开销当然大
    生成 Throwable 的时候会有一个很重的 native 调用 fillInStackTrace(),但可以关掉:

    Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)
    pwrliang
        15
    pwrliang  
       2018-04-03 00:39:48 +08:00
    javafx.util.Pair<Long, Long>
    Kongtou
        16
    Kongtou  
       2018-04-03 08:07:51 +08:00 via Android
    你们懂什么叫异常吗,异常的语义是什么?
    lihongjie0209
        17
    lihongjie0209  
       2018-04-03 08:41:01 +08:00
    你考虑过调用者的感受吗
    pinocc
        18
    pinocc  
       2018-04-03 11:17:32 +08:00
    合并成一行
    johnidy
        19
    johnidy  
       2018-04-03 12:09:08 +08:00
    这个方法好像并没有什么用处
    metrxqin
        20
    metrxqin  
       2018-04-03 12:59:37 +08:00
    在 Java 或者任何面向对象世界,我们称之为方法!

    让我打个恰当的比喻,这个方式上面插满了目眩神迷的各种 Java 特性,不仅有 @Nullable 还有 try-catch,但仍逃脱不了做养料的命运!
    XinLake
        21
    XinLake  
    OP
       2018-04-03 18:29:12 +08:00 via Android
    @metrxqin 樱樱樱。。。 养料是啥意思?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   990 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:22 · PVG 05:22 · LAX 13:22 · JFK 16:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.