【问题标题】:Multiple records inside the same .java file同一个 .java 文件中的多条记录
【发布时间】:2021-06-18 10:11:02
【问题描述】:

我们总是可以在一个 .java 文件中包含多个类。考虑到封装和每个类都包含多行代码,在 1 个 .java 文件中包含 1 个类(不要谈论嵌套类)总是有意义的。

现在记录开始发挥作用,它们可以少至 1 行代码。在同一个 .java 类中封装多条记录有意义吗?

例如我们可以有

DTO.java 文件将包含

record Employees(List<Employee> employees) { }  //This is just a wrapper class that we normally need in order to return a list of objects in rest web services
record Employee(String name, Integer age, List<Attribute> attributes){ }
record Attribute(String name, String value) { }

如果没有记录具有公共访问修饰符,那么我们可以将它们全部包含在一个名为 DTO.java

的文件中

在我看来,拥有 3 个 .java 文件,每个文件中只有 1 行代码似乎不太好。

但是,我们仍然会面临multiple classes inside same java file 此处描述的这些问题

【问题讨论】:

    标签: java class java-record java-16


    【解决方案1】:

    目前还没有官方方法可以做到这一点。
    作为一种解决方法,您可以创建一个空接口并将所有记录放入其中,例如,如果您的控制器是 CompanyController,我将创建一个名为 CompanyPort 的接口,其中包含所有 dto 记录

    CompanyPort.java

    public interface CompanyPort {
          record Employees(List<Employee> employees) { } 
          record Employee(String name, Integer age, List<Attribute> attributes){ }
          record Attribute(String name, String value) { }
    }
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      没有改变的事实是:

      1. 一个.java 文件中不能有多个public 类。但是,您可以在同一个.java 文件中拥有任意数量的非public 类。
      2. .java 文件的名称必须与其中的public 类相同。
      3. 如果.java 文件中的所有类都不是public,则它可以有任何名称。

      注意:由于您在问题中提到了另一个答案,因此我在演示中也包含了这些课程,以防它们有助于连接点。

      Attribute.java:

      import java.util.List;
      
      public record Attribute(String name, String value) { }
      record Employee(String name, Integer age, List<Attribute> attributes){ }
      record Employees(List<Employee> employees) { }
      

      Bar.java:

      public class Bar {
          
      }
      class Baz {
          public void hello(){
              System.out.println("Hello");
          }
      }
      

      Foo.java:

      import java.util.List;
      
      public class Foo {
          public static void main(String[] args) {
              Attribute attr1 = new Attribute("A", "X");
              Attribute attr2 = new Attribute("B", "Y");
              System.out.println(attr1);
      
              Employee e1 = new Employee("James", 23, List.of(attr1, attr2));
              System.out.println(e1);
              Employee e2 = new Employee("Boug", 21, List.of(attr2));
      
              Employees emps = new Employees(List.of(e1, e2));
              System.out.println(emps);
      
              Baz baz = new Baz();
              baz.hello();
          }
      }
      

      终端命令:

      [~/Desktop/Record]: javac Bar.java
      [~/Desktop/Record]: javac Attribute.java 
      [~/Desktop/Record]: javac Foo.java 
      [~/Desktop/Record]: java Foo
      Attribute[name=A, value=X]
      Employee[name=James, age=23, attributes=[Attribute[name=A, value=X], Attribute[name=B, value=Y]]]
      Employees[employees=[Employee[name=James, age=23, attributes=[Attribute[name=A, value=X], Attribute[name=B, value=Y]]], Employee[name=Boug, age=21, attributes=[Attribute[name=B, value=Y]]]]]
      Hello
      

      【讨论】:

      • 4.当名称确定文件名的类未被引用时,当编译器/构建工具或 IDE 不知道在哪里搜索特定类时,您可能会遇到问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      相关资源
      最近更新 更多