Несколько записей в одном файле .java

У нас всегда может быть несколько классов внутри файла .java. Учитывая инкапсуляцию и то, что каждый класс состоит из нескольких строк кода, всегда имело смысл иметь 1 класс (не говоря уже о вложенных классах) внутри 1 файла .java.

Теперь, когда в игру вступают записи, они могут занимать всего 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 с одной строкой кода внутри каждого.

Однако мы все еще можем столкнуться с проблемами, подобными описанным здесь, несколько классов внутри одного java файла.

3 ответа

В настоящий момент нет официального способа сделать это.
В качестве обходного пути вы можете создать пустой интерфейс и поместить все свои записи внутрь, например, если ваш контроллер 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) { }
}

Надеюсь, это поможет

Факты, которые не изменились:

  1. В одном файле не может быть более одного класса. Однако вы можете иметь столько классов, не являющихся классами, в одном файле, сколько захотите.
  2. Имя файла должно совпадать с именем класса в нем.
  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

В этом случае, поскольку записи связаны, вы можете сделать то же самое, что и статические внутренние классы в стандартном классе, то есть:

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

Потребитель, как и раньше, будет иметь доступ к подзаписям как

      Employees.Employee employee;
Employees.Attribute attribute;
Другие вопросы по тегам