-1

C# のフラグに相当する EnumSet を適切に使用する方法を理解しようとしています。これが私の実装とこれを使用するメソッドです。ご覧のとおり、フラグが存在するかどうかのチェックが正しく機能していません。私が間違っていることを教えてください。

EnumSet を持つ次の Enum があります。

public enum ExcelRangeBordersFlag {
    BORDER_LEFT,
    BORDER_BOTTOM,
    BORDER_TOP,
    BORDER_RIGHT;

    public static final EnumSet<ExcelRangeBordersFlag> SELECTED_BORDERS = EnumSet.noneOf(ExcelRangeBordersFlag.class);
}

(これは正しく実装されていますか?)

セットに追加したり、セットに値が含まれているかどうかを確認したりできるようにしたいと考えています。しかし、これは機能していません:

private static ExcelRangeBordersFlag getBordersFlag(boolean bottom, boolean top, boolean left, boolean right){
        ExcelRangeBordersFlag results =  null; 

        if (bottom){
            results.SELECTED_BORDERS.add(ExcelRangeBordersFlag.BORDER_BOTTOM);
        }

        if (top){
            results.SELECTED_BORDERS.add(ExcelRangeBordersFlag.BORDER_TOP);
        }

        if (left){
            results.SELECTED_BORDERS.add(ExcelRangeBordersFlag.BORDER_LEFT);
        }

        if (right){
            results.SELECTED_BORDERS.add(ExcelRangeBordersFlag.BORDER_RIGHT);
        }

        System.out.println(results);

        return results;
    }


private static void MergeAndWriteToCell(Sheet sh, int sRow, int eRow, int sCell, int eCell, ExcelRangeBordersFlag borders , String text){
        CellRangeAddress cellRangeAddress = new CellRangeAddress(sRow, eRow, sCell, eCell);
        sh.addMergedRegion(cellRangeAddress);
        Row row = sh.getRow(sRow);
        Cell cell = row.getCell(sCell);
        cell.setCellValue(text);

        if (borders.SELECTED_BORDERS.contains(ExcelRangeBordersFlag.BORDER_BOTTOM)){
            RegionUtil.setBorderBottom(CellStyle.BORDER_MEDIUM, cellRangeAddress, sh, wb);
            System.out.println("Contains bottom.");
        }

        if (borders.SELECTED_BORDERS.contains(ExcelRangeBordersFlag.BORDER_LEFT)){
            RegionUtil.setBorderLeft(CellStyle.BORDER_MEDIUM, cellRangeAddress, sh, wb);
            System.out.println("Contains left.");
        }

        if (borders.SELECTED_BORDERS.contains(ExcelRangeBordersFlag.BORDER_TOP)){
            RegionUtil.setBorderTop(CellStyle.BORDER_MEDIUM, cellRangeAddress, sh, wb);
            System.out.println("Contains top.");
        }

        if (borders.SELECTED_BORDERS.contains(ExcelRangeBordersFlag.BORDER_RIGHT)){
            RegionUtil.setBorderRight(CellStyle.BORDER_MEDIUM, cellRangeAddress, sh, wb);
            System.out.println("Contains right.");
        }

        System.out.println();

    }

最後のメソッドは、次のようにしても、すべての ExcelRangeBorder 型が含まれていることを示しています。

borders = getBordersFlag(false, false, false, false);
        MergeAndWriteToCell(sh, 4,4,1,3, borders, "Percent of Original List Price Received*");

出力:

null
Contains bottom.
Contains left.
Contains top.
Contains right.
4

1 に答える 1

2

あなたの問題の根本は、の静的フィールドであってSELECTED_BORDERSはならExcelRangeBordersFlag、むしろ、あなたが渡すものであるべきだと思います。たとえば、次のように書く必要があります

private static Set<ExcelRangeBordersFlag> getBordersFlag(
      boolean bottom, boolean top, boolean left, boolean right){
    ExcelRangeBordersFlag results = EnumSet.noneOf(ExcelRangeBordersFlag.class); 

    if (bottom){
        results.add(ExcelRangeBordersFlag.BORDER_BOTTOM);
    }

    if (top){
        results.add(ExcelRangeBordersFlag.BORDER_TOP);
    }

    if (left){
        results.add(ExcelRangeBordersFlag.BORDER_LEFT);
    }

    if (right){
        results.add(ExcelRangeBordersFlag.BORDER_RIGHT);
    }

    System.out.println(results);

    return results;
}

ExcelRangeBordersFlagフラグ値のセットであるかのように渡そうとしているように見えますが、それは機能しません。AnはまたはExcelRangeBordersFlagのような値です。あなたはそれらの周りを回っているはずです。BORDER_BOTTOMBORDER_LEFTSet

于 2015-12-14T18:04:31.750 に答える