java 定义方法,是分开定义还是定义一个在if判断,哪种更好,性能高些
黄舟
黄舟 2017-04-17 13:03:38
[Java讨论组]

下面两种哪种好些,性能快些

第一种:

public String pins(String categoryId, Integer boardId, Integer userId, String username, Integer max, Integer limit) {
    if (categoryId != null) {

    } else if (boardId != null) {

    } else if (userId != null) {

    } else if (username != null) {

    }
    return "";
}

第二种:

public String pinsCategoryId(String categoryId, Integer max, Integer limit) {

    return "";
}

public String pinsBoardId(Integer boardId, Integer max, Integer limit) {

    return "";
}

public String pinsUserId(Integer userId, Integer max, Integer limit) {

    return "";
}

public String pinsUsername(String username, Integer max, Integer limit) {

    return "";
}
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(12)
巴扎黑

4个方法,只有 id/name 参数不一样,再加个参数可以一个方法定义出来

enum PinType {
    CATEGORY,
    BOARD,
    USER_ID,
    USER_NAME
};

String pin(PinType type, Object id, Integer max, Integer limit) {
    switch(type) {
        ...
    }
}

由于你返回值是 String 类型,我猜你函数内部很有可能需要把 Integer 的 id 变成 String。这种情况下可以把第 2 个参数明确定义成 String,在传入 Integer 的 id 时传入它的 toString() 结果。

这种使用 switch 的结构看起来和上面的 if 结构类似,但是语义上要简单好理解得多。

如果你不想使用 switch 结构,可以定义接口,通过匿名类对象来实现。如果你用 Java8,可以使用 Lambda 表达式来实现。

大家讲道理

你只要想一下写方法注释的时候,哪一种写出来的注释更简洁明了,就知道哪种更好了。
毕竟程序首先是要给人看的。

黄舟

个人感觉

1.针对性能来说这两种实现方式的优劣是无意义的,因为,无论使用这两种的哪一种,程序运行起来,都不会在性能上有什么差别。

2.在可读性和可维护性上来说可能更有讨论空间:第一种方式,参数太多,并且是不可扩展的。如果你pins的可能性增加了,那么你第一个方法就必须修改(增加参数和if else),除此之外,调用该方法的所有地方都必须进行散弹式修改。而第二种方式,只要新添加一个方法就行了。如果是面向接口编程的话,那么要修改的点几乎只是增加一个新的方法这一点,其他地方的代码根本不用动。

@janet_ddr 说的是有些道理的。你的方法应该越简单越好,一个方法只做一件事。

伊谢尔伦

yo man,how about this one:

public class CheckItOut {

    enum PinType {
        CATEGORY {
            @Override
            String pin(String id, int max, int limit) {
                return StringUtils.EMPTY;
            }
        },
        BOARD {
            @Override
            String pin(String id, int max, int limit) {
                return StringUtils.EMPTY;
            }
        },
        USER_ID {
            @Override
            String pin(String id, int max, int limit) {
                return StringUtils.EMPTY;
            }
        },
        USER_NAME {
            @Override
            String pin(String id, int max, int limit) {
                return StringUtils.EMPTY;
            }
        };

        abstract String pin(String id,int max,int limit);
    }

    @Test
    public void testThemOutYo(){
        PinType.BOARD.pin("id001",Integer.MAX_VALUE,1000);
    }
}

调用起来蛮好看。

PHPz

没有任何理由选择第一种

阿神

都不适合,用抽象吧

迷茫

看不出来那几个方法是干什么的。

如果你仅仅是想判断那四个参数的合法性,用第二种。如果你要做一件事同时需要这四个参数,用第一种。

天蓬老师

看了你的这几个方法,仔细一看,只有第一个参数不一样,后两个都一样.
我觉得原型模式挺适合这里的

黄舟

性能差异不大,只能从可读性来看。第一种参数列表太长了给人烦躁的感觉,尤其是调用的时候更让人抓狂.第二种的话用抽象不错噢

PHPz

用枚举,一般不需要在这个级别考虑性能问题

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号