具有不同数量参数的Java枚举实例

时间:2019-03-04 09:57:34

标签: java enums

有什么办法可以使Java中的Enum接受不同数量的参数,从而无需使用varargs来实现这一点。

<div class="table-responsive">
                    <table id="corporate" class="table table-bordered report-table " style="width:100%">
                      <thead>
                      <tr>
                        <th  style="width:200px;" (click)="coporateCustomerSortBy('name')">
                          <div class="disp-blk-2"> Name    <span *ngIf="sortType == 'name' && !sortReverse" class="fas fa-sort-amount-up"></span>
                            <span *ngIf="sortType == 'name' && sortReverse" class="fas fa-sort-amount-down"></span></div>

                        </th>
                        <th style="width:200px;" (click)="coporateCustomerSortBy('location')">
                          <div class="disp-blk-2" >Location <span *ngIf="sortType == 'location' && !sortReverse" class="fas fa-sort-amount-up"></span>
                            <span *ngIf="sortType == 'location' && sortReverse" class="fas fa-sort-amount-down"></span></div>

                        </th>
                        <th style="width:200px;" (click)="coporateCustomerSortBy('website')">
                          <div class="disp-blk-2">Website   <span *ngIf="sortType == 'website' && !sortReverse" class="fas fa-sort-amount-up"></span>
                            <span *ngIf="sortType == 'website' && sortReverse" class="fas fa-sort-amount-down"></span></div>

                        </th>
                        <th style="width:200px;">
                          <div class="disp-blk-2">Phone Number</div>
                        </th>
                        <th style="width:200px;">
                          <div class="disp-blk-2">No. of Facilities</div>
                        </th>
                        <th style="width:200px;" (click)="coporateCustomerSortBy('venue')">
                          <div class="disp-blk-2">Venue Name  <span *ngIf="sortType == 'venue' && !sortReverse" class="fas fa-sort-amount-up"></span>
                            <span *ngIf="sortType == 'venue' && sortReverse" class="fas fa-sort-amount-down"></span></div>

                        </th>

                        <th style="width:200px;">
                          <div class="disp-blk-2">Options</div>
                        </th>
                      </tr>
                      </thead>
                      <tbody>

此处,LITERAL和NUMBER仅接受一个参数,即目标值,而DATE实例接受两个参数。我经历了几个问题,才发现使用泛型无法实现这一点,因为枚举实际上并没有真正支持泛型。

此外,从设计的角度来看,我是否可以不将所有类型都包含在Enum中,而是将它们包含在具有某些变通方法的类中,请记住,需要从json解组此ValueType实例,并且将调用getRepresentation方法在未编组的枚举实例上获取目标值的实际表示形式。

2 个答案:

答案 0 :(得分:0)

这是不可能的,因为LITERAL,NUMBER和DATE符合枚举ValueType的接口。如果可能的话,这里将违反类型安全性:

LITERAL()
{
    @Override
    String getRepresentation(String args) {
        return MvelStringUtil.representAsLiteral(arg);
    }
}    
...
ValueType x = ValueType.LITERAL;
x.getRepresentation("a","b"); // the compiler could not know whether this is syntactically correct

答案 1 :(得分:0)

正如其他答案所说,这是不可能的。 目标是确保给定类型的参数个数不会错误,以便调用代码中的错误很快会出现,对吗?

我将在每个getRepresentation方法实现中使用简单的验证。检查数组长度,如果不正确,请抛出异常

这样,有效性规则将保持在靠近主题的位置,这是可读的。您不会在编译时就知道错误,但是至少您会在运行时更早地知道它们。

广告设计的观点-我会列举一下。类型的数量是有限的,在编译时就知道了,通过对枚举的快速检查,每个人都会知道那里存在什么可能性...