Как показать, может ли метод возвратить пустой указатель

Для удобства я добавил расширение в свой собственный файл

import UIKit

  public extension UIWindow {

    func capture() -> UIImage {

      UIGraphicsBeginImageContextWithOptions(self.frame.size, self.opaque, UIScreen.mainScreen().scale)
      self.layer.renderInContext(UIGraphicsGetCurrentContext()!)
      let image = UIGraphicsGetImageFromCurrentImageContext()
      UIGraphicsEndImageContext()

      return image
  }
}

, вызвав расширение следующим образом:

let window: UIWindow! = UIApplication.sharedApplication().keyWindow

let windowImage = window.capture()

Аналогичным образом можно было расширить UIView для захвата образ этого ....

45
задан Community 23 May 2017 в 12:25
поделиться

11 ответов

Очень хорошее развивает вопрос. Я рассматриваю null действительно специальное значение, и если метод может возвратиться null, он должен ясно зарегистрировать в Javadoc, когда он делает (@return some value ..., or null if ...). При кодировании я являюсь защитным, и предполагаю, что метод может возвратиться null, если я не убежден, что он не может (например, потому что Javadoc заявил так.)

Люди поняли, что это - проблема, и предлагаемое решение должно использовать аннотации для утверждения намерения способом, это может быть проверено автоматически. См. JSR 305: Аннотации для Обнаружения Дефекта программного обеспечения , JSR 308: Аннотации на Типы и Java практическое руководство JetBrain Nullable .

Ваш пример мог бы быть похожим на это и отказался IDE, компилятором или другими инструментами анализа кода.

@NotNull
public Object methodWhichCannotReturnNull(int i) throws Exception
{
    return null; // this would lead to a compiler error!
}
36
ответ дан Ronald Blaschke 26 November 2019 в 21:27
поделиться

Можно использовать Option тип, который очень похож на список, который имеет нуль или один элемент. Тип возврата Option<Object> указывает, что метод может возвратиться Object, или это может возвратить специальное значение типа None. Этот тип является заменой для использования пустого указателя с лучшими проверками типа.

Пример:

public Option<Integer> parseInt(String s) {
   try {
      return Option.some(Integer.parseInt(s));
   }
   catch (Exception e) {
      return Option.none();
   }
}

при использовании этого последовательно можно включить пустые предупреждения IDE, или просто использовать grep для null, который не должен появляться в коде вообще, если бы Вы используете Option.none() везде, Вы обычно использовали бы null литерал.

Option прибывает стандарт с Scala, и это называют Maybe в Haskell. Ссылка выше к библиотеке, названной Функциональный Java, который включает ее. Та версия реализует эти Iterable интерфейс и имеет одноместные методы, которые позволяют Вам составить вещи приятно. Например, для обеспечения значения по умолчанию 0 в случае [1 114]:

int x = optionalInt.orSome(0);

И можно заменить это...

if (myString != null && !"".equals(myString))

... с этим, если Вы имеете Option<String>...

for (String s : myOptionString)
8
ответ дан Apocalisp 26 November 2019 в 21:27
поделиться

Действительно: в нашей платформе у нас есть 'непустой' тип указателя, который может быть возвращен, чтобы указать, что метод будет всегда возвращать значение.

я вижу три опции:

  1. ожидают поддержки языка для выражения его (например, C#?! вещь)
  2. Ориентация Аспекта использования для создания собственных расширений языка для выражения это
  3. использует пользовательский тип для выражения его
  4. (но основывается на сотрудничестве разработчика), используют схему именования для указания на него
2
ответ дан Community 26 November 2019 в 21:27
поделиться

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

, С другой стороны, я признаю, что не рассматриваю пустой указатель как что-то, чтобы бояться. Существуют ситуации, в которых "ничей дом" является значимым условием (хотя метод Несуществующего объекта также имеет действительное значение здесь).

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

2
ответ дан joel.neely 26 November 2019 в 21:27
поделиться

Вы взглянули на Spec#?

1
ответ дан Ray Booysen 26 November 2019 в 21:27
поделиться

Вы могли записать свою собственную аннотацию (Java) или атрибут (C#), чтобы указать, что возвращаемое значение могло бы быть пустым. Ничто автоматически не проверит его (хотя.NET 4.0 будет иметь контракты кода для этого вида вещи), но это, по крайней мере, действовало бы как документация.

1
ответ дан Jon Skeet 26 November 2019 в 21:27
поделиться

Существует некоторая поддержка @Nullable и @NotNull аннотация в ИДЕЕ IntelliJ . Существует также некоторый разговор о добавлении тех аннотаций (или подобная функция) к Java 7. К сожалению, я не знаю, как далеко это добралось или если это все еще на ходу вообще.

1
ответ дан Joachim Sauer 26 November 2019 в 21:27
поделиться

Возможно, Вы могли определить универсальный класс по имени "NotNull", так, чтобы Ваш метод мог бы быть похожим:

public NotNull<Object> methodWhichCannotReturnNull(int i) throws Exception
{
   // the following would lead to a run-time error thown by the
   // NotNull constructor, if it's constructed with a null value
   return new NotNull<Object>(null);
}

Это - все еще время выполнения (не время компиляции) проверка, но:

  • Это брошено в реализацию метода (это не отказ в коде вызова)
  • , Это самодокументирует (вызывающая сторона знает, что он добирается NotNull<T> как тип возврата)
1
ответ дан ChrisW 26 November 2019 в 21:27
поделиться

Любой ценой постарайтесь не полагаться на JavaDocs. Люди только читают их, если подпись не будет казаться тривиальной и очевидной (Который плох для начала), и они, кто на самом деле потрудился читать их, то менее вероятно, сделают ошибку с пустыми указателями, так как они в настоящее время более осторожны.

1
ответ дан Uri 26 November 2019 в 21:27
поделиться

При использовании Java 5 + можно использовать пользовательскую Аннотацию, например, ОБНОВЛЕНИЕ @MayReturnNull

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

0
ответ дан opyate 26 November 2019 в 21:27
поделиться

Вообще говоря, я предположил бы, что пустое возвращаемое значение против контракта API по умолчанию. Почти всегда возможно разработать Ваш код, таким образом, что нулевое значение никогда не возвращается из Ваших API во время "нормального" потока выполнения. (Например, проверьте foo.contains (obj) скорее тогда звонящий foo.get (obj) и имеющий отдельное ответвление для пустого указателя. Или, используйте шаблон Несуществующего объекта .

, Если бы Вы не можете разработать свой API таким способом, я ясно зарегистрировал бы, когда и почему пустой указатель мог быть брошен - в наименьшее количество в Javadoc, и возможно также использование пользовательского @annotation, такого как несколько из других ответов предложило.

0
ответ дан Ross 26 November 2019 в 21:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: