zoukankan      html  css  js  c++  java
  • [改善Java代码]严格限定泛型类型采用多重界限

    从哲学上来说,很难描述一个具体的人,你可以描述它的长相,性格,工作等,但是人都是有多重身份的,估计只有使用多个And(与操作)将所有的描述串联起来才能描述一个完整的人,人在不同的环境中角色也在不断的更换.

    用Java程序来对一类人进行管理,比如在公交车费优惠系统中,对部分人员,工资低于2500元的上班族而且是站立着的乘客 车费打8折.

    这里的类型参数有两个限制条件,一为上班族,二为乘客,具体到程序中就是一个泛型参数有两个上界Upper Bound,首先定义两个接口以及实现类:

     1 //职员
     2 interface Staff{
     3     //工资
     4     public int getSalary();
     5 }
     6 
     7 //乘客
     8 interface Passenger{
     9     //是否是站立状态
    10     public boolean isStanding();
    11 }
    12 
    13 class Me implements Staff,Passenger{
    14     public boolean isStanding(){
    15         return true;
    16     }
    17 
    18     public int getSalary() {
    19         return 2000;        
    20     }    
    21 }

    Me这种类型的人物有很多,不同的人都可能站着,但是他们的工资实现很可能不同.

    也就是说使用 T extends Me 是限定不了需求对象的.

    可以考虑使用多重限定,看代码:

     1 public class Client {
     2     //工资低于2500元的上斑族并且站立的乘客车票打8折
     3     public static <T extends Staff & Passenger> void discount(T t){
     4         if(t.getSalary()<2500 && t.isStanding()){
     5             System.out.println("恭喜你!您的车票打八折!");
     6         }
     7     }
     8     public static void main(String[] args) {
     9         discount(new Me());
    10     }
    11 }

    使用"&"符号设定多重边界Multi Bounds 指定泛型类型T必须是Staff和Passenger的共有子类型,此时变量t就 有了限定的方法和属性.

    在Java的泛型中,可以使用&符号关联多个上界并实现多个边界限定,而且只有上界才有此限定.

    下界没有多重限定的情况.

    多个下界,编码者可以自行推断出具体的类型.比如"? super Integer"和"? super Double"可以细化为Number类型了,或者Object类型了,无需编译器推断了.

    为什么要说明多重边界?

    因为编码者太少使用它了.比如一个判断用户权限的方法,使用的是策略模式Startegy Pattern,实例代码:

    import java.util.Arrays;
    import java.util.List;
    
    public class UserHandler<T extends User>{
        // 判断用户是否有权限执行操作
        public boolean permit(T user, List<Job> jobs) {
            List<Class<?>> iList = Arrays.asList(user.getClass().getInterfaces());
            // 判断是否是管理员
            if (iList.indexOf(Admin.class) > -1) {
                Admin admin = (Admin) user;
                /* 判断管理员是否有此权限 */
            } else {
                /* 判断普通用户是否有此权限 */
            }
            return false;
        }
    }
    
    
    
    interface User {
    
    }
    
    class UserImpl implements User, Admin {
    
    }
    
    interface Admin {
    
    }
    
    class Job {
    
    }

    此处进行了一次泛型参数类别判断,这里不仅仅违背了单一职责原则,而且已经使用泛型限定参数的边界了,还要进行泛型类型的判断.

    事实上,使用多重边界可以很方便的解决问题,而且非常优雅,建议读者在开发中考虑使用多重限定.

  • 相关阅读:
    数据库ALL和ANY的区别
    数据库-关系代数-投影
    数据库关系代数表达式学习
    数据模型的三要素
    题解 P2812 【校园网络【[USACO]Network of Schools加强版】】
    题解 P2746 【[USACO5.3]校园网Network of Schools】
    题解 P2257 【YY的GCD】
    题解 P6476 【[NOI Online #2 提高组]涂色游戏】
    题解 P2522 【[HAOI2011]Problem b】
    题解 P4782 【【模板】2-SAT 问题】
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/5626071.html
Copyright © 2011-2022 走看看