【问题标题】:Moving shared methods to a Util class in Java?将共享方法移动到 Java 中的 Util 类?
【发布时间】:2021-12-06 08:36:14
【问题描述】:

我有以下服务实现:

public class DataServiceImpl implements DataService {

    private static final String SHEET_TITLE = "export.permission.sheetTitle";

    private XSSFWorkbook workbook;
    private XSSFSheet sheet;
    private AtomicInteger rowCount;

    @Override
    public MultipartFile export() throws IOException {

        createSheet(SHEET_TITLE);

        // code omitted for brevity
    }

    private void createSheet(String title) {
        workbook = new XSSFWorkbook();
        sheet = workbook.createSheet(title);
        rowCount = new AtomicInteger(0);
    }
}

在这个类中,我有一些方法,例如createSheet 并且我想将此方法移动到 Util 类中,因为其他类似的类也会使用此方法。

但是,作为一些变量,例如workbooksheetrowCount 用于此服务的其他方法中,我不知道是否应该将这些变量传递给 Util 方法 createSheet 然后从它返回,或者其他适当的方法。那么,我应该如何将createSheet 方法移动到我的 Util 类中并在不同的类中使用它?

更新:我也有以下方法。我应该移动它们 Util 类吗?或者我应该为createMultipartFile() 方法创建一个类,就像createSheet() 方法一样,并且只将writeTitles() 方法移动到Util 类?

private MultipartFile createMultipartFile(String title, String extension) throws IOException {
    File outputFile = File.createTempFile(TextBundleUtil.read(title), extension);    
    workbook.write(outputStream);

    final FileInputStream input = new FileInputStream(outputFile);

    final String fileName = TextBundleUtil.read(title).concat(extension);
    return new MockMultipartFile(fileName,
            fileName, CONTENT_TYPE, IOUtils.toByteArray(input));
}


private static void writeTitles(Row row, List<String> titles, XSSFCellStyle style) {
    for (int i = 0; i < titles.size(); i++) {
        Cell cell = row.createCell(i);
        cell.setCellValue(titles.get(i));
        cell.setCellStyle(style);
    }
}

【问题讨论】:

  • 我认为在您发表评论的情况下,您需要将您的课程分成两部分,一个带有您需要的功能,另一个带有变量,只是看到您发布的内容,您不能简单地移动您的分类到另一个并扩展。
  • @AL 请举个例子,而不是试图只用文字来解释?
  • 看起来你正在做的事情需要有状态?但是像服务和 Util 类这样的东西不应该有会话状态,因为它们通常被不同的用户同时使用。无论哪种情况,共享状态似乎都是错误的。
  • 一般来说,如果你有一个名为UtilXUtil 的类,它只是用随意的静态方法集合填满了边缘,那就是糟糕的设计。有时这是最合适的方法,但很少见。恰当的例子:java.util.Collections(它是一个“Utils”类,只是没有这样命名)有sort...但是现在list 本身也是如此,这本来应该放在首位。
  • @NathanHughes Cris 作为答案发布的方法怎么样?这是正确的方法吗?

标签: java class inheritance static


【解决方案1】:

一种好的方法是将这些属性委托为一个单独的对象。见下文:

public class WorkSheet{
     private XSSFWorkbook workbook;
     private XSSFSheet sheet;
     private AtomicInteger rowCount;
     public WorkSheet(String title) {
       this.workbook = new XSSFWorkbook();
       this.sheet = workbook.createSheet(title);
       this.rowCount = new AtomicInteger(0);
   }
   public XSSFWorkbook getWorkbook() {
     return workbook;
   }
   public XSSFSheet getSheet() {
     return sheet;
   }
   public AtomicInteger getRowCount() {
     return rowCount;
   }  
 }
public class DataServiceImpl implements DataService {

    private static final String SHEET_TITLE = "export.permission.sheetTitle";
    private WorkSheet workSheet;
    
    @Override
    public MultipartFile export() throws IOException {

        workSheet = new WorkSheet(SHEET_TITLE);
        // code omitted for brevity
        
        //then use like workSheet.getSheet()
    } 
}

现在您可以在任何需要的地方使用该对象。

【讨论】:

  • 非常感谢克里斯,看起来不错,我会尝试的。在这个场景中,我认为没有必要使用 Util 类和createSheet 方法。我可以直接设置我的workSheet 变量并通过get 方法获取它的变量。这是真的吗?
  • 是的。你可以以任何你喜欢的方式扩展它。我只是提出了一种方法。如果这可以解决您的问题,请随时接受作为答案
  • 我当然会接受,但在此之前我需要确定是否有更合适的方法。我认为不可能通过 Util 类中的 Util 方法设置局部变量。这是真的吗?
  • 您还有什么其他的建议吗?
  • 您希望尽可能避免使用 util 方法。 Util 方法很少是一个好主意。对于您想做的事情,Kris 有一个完美的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多