2015-12-14 2 views
-1

Я пытаюсь понять, как правильно использовать EnumSet для эквивалента флагов C#. Вот моя реализация и методы, которые используют это. Как вы можете видеть, проверка наличия флага не работает должным образом. Не могли бы вы сообщить мне, что я делаю неправильно?Java EnumSet - добавить и проверить, содержит ли набор флаг

Я следующий Enum с EnumSet:

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. 
+1

Я не понимаю, что вы пытаетесь спросить. – redFIVE

+0

getBordersFlag должен вернуть мне перечисление с соответствующим EnumSet. MergeAndWriteToCell должен уметь видеть, содержит ли набор какое-либо одно из значений границы. – blgrnboy

+1

Это не вопрос – redFIVE

ответ

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; 
} 

Это выглядит IKE вы пытаетесь пройти вокруг ExcelRangeBordersFlag, как если бы это был набор значений флага, но это не то, как это работает. Значение ExcelRangeBordersFlag является величиной, равной BORDER_BOTTOM или BORDER_LEFT. Вы должны пройти мимо Set из них.

+0

И, вероятно, переименуйте перечисление, чтобы облегчить путаницу. – chrylis