当前位置: 首页 > 知识库问答 >
问题:

在java中使用界面正确

谢俊力
2023-03-14

有这个界面

public interface BookService {

List<Book> search(int childLimitPages, int numberOfBooks, List<Book> sourceOneResultSet, List<Book> sourceTwoResultSet);
}

有2个实现,当一个在其实现中不使用变量int ChilLimitPages时。

 public class AdultBookList implements BookService {

 // This won't work since there is missing variable, I am asking if there is other way to provide this ask
     List<Book> search(int numberOfBooks, List<Book> sourceOneResultSet, List<Book> sourceTwoResultSet) {
       .....
     }
 }

 public class ChildrenBookList implements BookService {

     List<Book> search(int childLimitPages, int numberOfBooks, List<Book> sourceOneResultSet, List<Book> sourceTwoResultSet) {
       .....
     }
 }

我的问题是我应该如何使用它?我应该有2个接口吗?可以给我一个默认变量吗?

共有2个答案

詹杰
2023-03-14

您可以将第一个参数定义为可选

public interface BookService {
    List<Book> search(Optional<Integer> limit, int numberOfBooks, List<Book> sourceA, List<Book> sourceB);
}

public class AdultBookList implements BookService {

    List<Book> search(Optional<Integer> limit, int numberOfBooks, List<Book> sourceA, List<Book> sourceB) {
    }
}

public class ChildrenBookList implements BookService {

    List<Book> search(Optional<Integer> childLimitPages, int numberOfBooks, List<Book> sourceA, List<Book> sourceB) {
    }
}

我喜欢我的API在结尾有可选参数。并将调用重定向到解决选项的内部计算。就像这样:

public class AdultBookList implements BookService {

    List<Book> search(int numberOfBooks, List<Book> sourceA, List<Book> sourceB, Optional<Integer> limit) {
        if (limit.isEmpty())
        {
            System.err.printf("The limit should have been set!");
            return Collections.emptyList();
        }
        return internalSearch(numberOfBooks, sourceA, sourceB, limit.get());
    }

    private List<Book> search(int numberOfBooks, List<Book> sourceA, List<Book> sourceB, int limit) {
        
    }
}

左丘宜然
2023-03-14

当你实现一个接口时,你需要用接口中声明的完全相同的签名来定义所有方法。

所以这个班

    public class AdultBookList implements BookService {

         List<Book> search(int numberOfBooks, 
                           List<Book> sourceOneResultSet, 
                           List<Book> sourceTwoResultSet) {
       .....
     }
 }

不是接口BookService的有效实现,因为方法搜索具有不同的签名。

你可以用不同的方法解决它。

第一种方法是在接口中重载方法搜索,并提供不带childLimitPages参数的方法。在实现中,如果使用childLimitPages调用方法,可以在AdultBookList中抛出异常。但我建议你用一种更优雅的方法来解决第二种问题。

第二种方法是用一个包裹参数的对象替换所有参数。在这个对象中,你可以定义默认值,所以当它没有显式地设置值时,它会接受默认值,比如:

public interface BookService {
    List<Book> search(SearchRequest request);
}

...
public class SearchRequest {
    // I replaced int with Integer to hold also null values
    private Integer childLimitPages;

    // Defining a default value
    private int numberOfBooks = 10;
    private List<Book> sourceOneResultSet;
    private List<Book> sourceTwoResultSet;

    ...
}
 类似资料:
  • 我试图在typescript中创建一个带有子对象的对象。我正在尝试建立一个猫鼬模式,如本问题所示。 如果我将对象和子对象定义为接口,我就不能在可以设置为mongoose模式的常量中使用它们。 那么,有没有一种方法可以让我不必两次键入整个子对象,一次在接口中,一次输入常量中?

  • 问题内容: 我想使按钮可单击,但是它不起作用-似乎需要使用,但我不知道如何使用。有问题的代码是: 问题答案: 通常,您用于将屏幕坐标从单击或触摸转换为游戏世界。这是必需的,因为原点不一定相同,并且使用相机还可以放大和缩小,四处移动,旋转等。取消投影将解决所有这些问题,并为您提供与指针位置匹配的游戏世界坐标。 在您的示例中,它将如下所示: 如此说来,您实际上不应该手动执行此UI任务。Libgdx还附

  • 作为一名Java Swing新手,我在将用户界面逻辑与域逻辑分离时遇到了一些困难。 我有一个小的(琐碎的?)带有JFrame的Swing应用程序,其中包含JLabel、JTextField和JButton。按下JButton时,会弹出JFileChooser对话框。选择文件后,JTextField包含文件的绝对路径。到目前为止还没有什么引人注目的。我想完成的下一件事是将文件的绝对路径“注入”到一个

  • 问题内容: 我不了解分隔符的工作原理,有人可以用外行人的方式解释吗? 问题答案: 扫描仪还可以使用空格以外的定界符。 来自Scanner API的简单示例: 关键是要了解内的正则表达式。在此处找到教程。 要从正则表达式开始,你可以在这里找到一个不错的教程。 笔记

  • 我知道这是一个简单的问题,但没有比堆栈溢出更好的问题了。我一直在开发一个Java桌面应用程序,它连接到远程数据库,并使用大量JTables和jasper报表。我已经到了必须开始考虑用户界面的时候,我注意到我可以使用JavaFX来实现用户界面。根据我一直在做的一些研究,JavaFX似乎提供了比Swing更好的用户界面。我的问题是,JavaFX适合我的应用程序吗?当我的应用程序使用大量数据库查询、表和

  • 问题内容: 美好的一天, 我有一个ServerSocket的无限循环,工作正常…问题是当我尝试使用按钮启动ServerSocket时。我的用户界面“冻结”什么都没有动,但服务器正常运行,这里有一个 ScreenShot : http://i.gyazo.com/15d331166dd3f651fc7bda4e3670be4d.png 当我按下按钮“ Iniciar”表示启动服务器时,用户界面冻结(