Есть ли способ указать длину массива при определении типа возвращаемого значения функции? - PullRequest
2 голосов
/ 06 августа 2020

Если у меня есть метод, возвращающий массив, есть ли способ указать длину возвращаемого им массива? Что-то вроде:

public int[2] getPoint() {
    return new int[] {0, 1};
}

Это поможет добавить ограничения при переопределении этого метода в подклассе и убедиться, что другие классы реализуют этот метод правильно, потому что они будут знать, что он должен возвращать массив длины 2 (или что-то еще). Есть ли способ сделать это?

Ответы [ 3 ]

4 голосов
/ 06 августа 2020

Короткий ответ: нет. Вы не можете сделать это с массивом.

Более длинный ответ: если вы окажетесь в ситуации, когда вам нужно что-то вроде этого, вам действительно нужен класс с двумя полями. В зависимости от домена вашего приложения его можно назвать по-другому, например, для графического приложения у вас может быть класс Point с координатами x и y.

public class Point {
  private final int x;
  private final int y;

  // the usual constructor, getters, setters and stuff
}

Или, если вы не хотите создавать свой собственный класс для этой цели вы можете использовать кортеж , например, Pair из Apache Commons lib.

Классы - это способ предоставить такие абстракции, описывающие структуру данных, которая вам нужна, с classes не только поможет вам выполнить работу, но и сделает код более понятным для читателей вашего кода, включая вас в будущем: -)

2 голосов
/ 06 августа 2020

Нет, длина массива не определена в типе

укажите длину возвращаемого массива

Нет, объявив тип возвращаемого значения метода как массив не включает длину.

Но на самом деле это не имеет значения. Чтобы получить аналогичный эффект:

  • Верните неизменяемый List, а не массив.
  • Вызывающий код может просто запросить у списка его размер.
…
return List.of( "Bob" , "Newhart" ) ;

Конечно, вызывающий код может запрашивать у массива его размер, а также запрашивать список. Но использование немодифицируемого списка блокирует этот размер.

Определите класс

Вместо того, чтобы взламывать массив или список, чтобы иметь определенные значения в определенных слотах для неявной передачи значения, определите класс для явно представляют семантику ваших значений.

Records

Новая функция Records для Java 16 (предварительно просмотренная в 14 и в 15 ) делает это чрезвычайно простым.

record Name ( String givenName, String surname  ) {}

Таким образом, вы должны вернуть объект этого типа.

…
return new Name( "Bob" , "Newhart" ) ;

Point пример

В вашем примере определите запись с именем Point.

record Point( int x , int y ) {}

Создать экземпляр.

…
return new Point( 7 , 42 ) ;

Доступ к данным.

System.out.println( "x = " + myPoint.x() ) ;

x = 7

0 голосов
/ 06 августа 2020

Никакая длина массива не может быть определена в типе возвращаемого значения метода. Как другие предлагают, вы можете сделать это, определив класс с набором свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...