美文网首页
内部类作用

内部类作用

作者: zxbyh | 来源:发表于2023-03-15 15:49 被阅读0次

内部类的作用就是增加软件系统的内聚.

一 如果一个对象B只能作为对象A的成员,那么就应该吧这个B作为A的内部类.

下面举一个下订单场景的例子。业务诉求如下:
1,商品如果参加了活动就会根据用户的会员等级8折。
2,商家可以在订单总额上再折扣一定额度。
代码如下:

@RequiredArgsConstructor
@Getter
public class OrderInfo {
    private final String orderCode;
    private final String shopId;
    private final String buyerId;
    private final Integer buyerLevel;
    private Double discountAmount = 0D;
    private final Long orderDate;
    private List<OrderGoods> orderGoodsList = new ArrayList<>();

    @AllArgsConstructor
    @Data
    public class OrderGoods{
        private final String orderGoodsCode;
        private final String skuId;
        private Integer num;
        private final Double price;
        private final Boolean ifAct; //是否有活动

        private Double calculateAmount(){
            Double tmp = this.price*this.num;
            //例如 要根据用户的等级进行折扣;
            if(this.ifAct && buyerLevel>=2){ //内部类里面可以非常方便的访问宿主类
                tmp = tmp*0.8;
            }

            return tmp;
        }

    }

    //增加sku到订单中. 如果sku是已存在的,就增加数量并检查价格是否变动,否则就加进去.
    public OrderInfo addGoods(String orderGoodsCode, String skuId, Integer num, Double price, Boolean ifAct) {
        this.orderGoodsList.stream().filter(x->x.getSkuId().equals(skuId)).findFirst().ifPresentOrElse(
            x->{
                Asserts.defend(x.getPrice().doubleValue()!=price.doubleValue(),-1001,"sku价格变动!");
                x.setNum(num+x.getNum());
            },
            ()->this.orderGoodsList.add( new OrderGoods(orderGoodsCode, skuId, num, price, ifAct))
        );
        return this;
    }

    public Double calculateAmountFinal(){
        return this.orderGoodsList.parallelStream().mapToDouble(x->x.calculateAmount()).sum() - this.discountAmount; //内部类的私有方法可以在宿主类使用;
    }

}

弄成内部类的好处如下:
1 内部类里面可以非常方便的访问宿主类.
2 内部类的私有方法可以在宿主类使用.
3 内部类的构造函数应该在宿主类的方法里面执行.
4 如果要在外面new出这个内部类的话就要设置成public static , 但是如果出现这样的情形,就不适合弄成内部类了.

注意: 内部类要定义成public 才能在外面访问得到它的成员,

二 java 的函数不能返回多个参数 如果弄成Map<String,Object> 在使用的时候又不方便,这时候就可以弄一个内部类;
public class MoreReturn {
    private String info = "多返回值的演示说明!";

    public void deal(){
        //todo 其他的一些业务代码
        
        var rlt = this.getRlt();
        
        if(rlt.code==200){
            //todo 成功要干什么
        }
        else{
            //todo 失败要干什么
            
            Asserts.fail(rlt.code,rlt.Msg);
        }
    }
    
    
    @AllArgsConstructor
    @Data
    class TmpRtl {
        Integer code;
        String Msg;
    }
    TmpRtl getRlt(){
        return new TmpRtl(200,"Success");
    }
    
}
这时候更好的方式是使用record,来代替内部类 充当多返回参数的载体。
public class MoreReturn {
    private String info = "多返回值的演示说明!";

    public void deal(){
        //todo 其他的一些业务代码
        
        var rlt = this.getRlt();
        
        if(rlt.code==200){
            //todo 成功要干什么
        }
        else{
            //todo 失败要干什么
            Asserts.fail(rlt.code,rlt.msg);
        }
    }
    
    
    record TmpRlt(Integer code,String msg){}
    TmpRlt getRlt(){
        return new TmpRlt(200,"Success");
    }
    
}
三 更神奇的用法在函数里面定义内部类,record,enum 。
public static void main(String[] args) {
        enum GoodsField{ price, name, category }
        
        System.out.println(JSONUtil.toJsonPrettyStr(
            calculateParam(
                List.of(
                    new QRecord(GoodsField.name,Opt.like,"测试"),
                    new QRecord(GoodsField.price,Opt.greater_equal,129.9D),
                    new QRecord(GoodsField.price,Opt.less_equal,299.9D)
                )
            )
        ));
    }

相关文章

  • 内部类

    成员内部类 局部内部类(定义在方法内和定义在作用域内的类) 匿名内部类

  • Java 内部类

    内部类包括成员内部类、方法内部类、*静态内部类、匿名内部类*。 内部类的作用 由于内部类的实现和外部类没有关系,内...

  • 方法内部类

    定义在外部类方法中的内部类,也称局部内部类方法内部类1.定义在方法内部,作用范围也在方法内2.和方法内部成成员使用...

  • 内部类

    1.内部类的作用与使用场合2.内部类的分类3.非静态内部类4.静态内部类5.匿名内部类 1.内部类的作用与使用场合...

  • JAVA内部类总结笔记

    内部类分为四类:成员内部类、局部(作用域)内部类、匿名内部类、静态内部类。 内部类大比拼 成员内部类 就像一个成员...

  • ViewHolder 为什么加上static修饰

    静态内部类主要作用就是,内部类是否需要隔离“外部类的this对象(指针)”。内部类是有 this 指针的,可以“直...

  • 4 内部类

    4.1 内部类概述 定义在其他类内部的类被称为内部类,包含内部类的类也被称为外部类。 内部类有如下作用: ...

  • Java学习——内部类

    内部类 一,成员内部类(包括静态内部类和非静态内部类) 非静态内部类可以直接访问外部类的成员,反之则不行 非静态内...

  • Java 内部类、静态内部类、方法内部类(未完待续)

    内部类 什么是内部类?内部类其实就是在一个类中创建的类。内部类有四种: 成员内部类 静态内部类 局部内部类 匿名内...

  • Java内部类

    一、内部类作用 二、使用 a)通用规则 1.类相关、实例相关 1)普通内部类、匿名内部类、局部内部类对象的创建依赖...

网友评论

      本文标题:内部类作用

      本文链接:https://www.haomeiwen.com/subject/dwvlrdtx.html