2

我们总是可以在一个 .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 行代码似乎不是很好。

但是,我们仍然会遇到类似这里描述的问题,同一个 java 文件中的多个类

4

2 回答 2

5

没有改变的事实是:

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

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

属性.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) { }

酒吧.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
于 2021-03-21T17:48:06.917 回答
4

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

公司端口.java

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

希望这会有所帮助

于 2021-10-16T22:24:27.527 回答