¿Es nulo regresar mal diseño? [cerrado]

127

He escuchado algunas voces que dicen que verificar un valor nulo devuelto de los métodos es un mal diseño. Me gustaría escuchar algunas razones para esto.

pseudocódigo:

variable x = object.method()
if (x is null) do something
koen
fuente
13
Elaborado: ¿dónde están estas personas que dicen que es malo? ¿Enlaces?
jcollum
2
Si el método es algo sobre lo que tiene control, puede realizar pruebas unitarias para asegurarse de que nunca devuelva nulo, de lo contrario, no veo por qué sería una mala práctica verificar si es nulo, después de esa llamada; tal vez sea una mala práctica en ese método devolver nulo, pero debe proteger su código
BlackTigerX
9
Elevar excepciones solo porque no hay datos para devolver es increíblemente molesto. El flujo normal del programa no debe arrojar excepciones.
Thorarin
44
@David: Eso es lo que dije realmente. Si un método devuelve datos, pero no hay ninguno, eso significa que algo también salió mal. Ese no es el flujo normal del programa :)
Thorarin
2
@Thorarin: el flujo de programa "normal" es un concepto bastante elástico: no es realmente una base sólida para una discusión.
Tomislav Nakic-Alfirevic

Respuestas:

206

La razón detrás de no devolver nulo es que no tiene que verificarlo y, por lo tanto, su código no necesita seguir una ruta diferente en función del valor de retorno. Es posible que desee consultar el Patrón de objetos nulos que proporciona más información al respecto.

Por ejemplo, si tuviera que definir un método en Java que devolviera una Colección, normalmente preferiría devolver una colección vacía (es decir Collections.emptyList()) en lugar de nula, ya que significa que mi código de cliente está más limpio; p.ej

Collection<? extends Item> c = getItems(); // Will never return null.

for (Item item : c) { // Will not enter the loop if c is empty.
  // Process item.
}

... que es más limpio que:

Collection<? extends Item> c = getItems(); // Could potentially return null.

// Two possible code paths now so harder to test.
if (c != null) {
  for (Item item : c) {
    // Process item.
  }
}
Adamski
fuente
66
Sí, mucho mejor que devolver nulo y esperar que el cliente recuerde tratar el caso.
djna
10
Estaré feliz de aceptar que devolver nulo es una locura cuando se usa como sustituto de contenedores vacíos (o cadenas). Sin embargo, ese no es el caso común.
MSalters
2
+1 para el Patrón de objetos nulos para mí también. Además, cuando realmente quiero devolver nulo, he estado nombrando el método como getCustomerOrNull () para hacerlo explícito. Creo que un método se llama bien cuando el lector no quiere mirar la implementación.
Mike Valenty
44
El comentario '// Dos posibles rutas de código ahora' no es correcto; tienes dos rutas de código de cualquier manera. Sin embargo, con el objeto Colección nulo en su primer ejemplo, la ruta del código 'nulo' es más corta. Sin embargo, todavía tiene dos rutas y aún necesita probar dos rutas.
Frerich Raabe
1
@MSalters: podría decirse que cada variable en lenguajes OO nulles un "contenedor", que contiene cero o un puntero a los objetos. (Así es como es modelado explícitamente por Haskell's Maybeen esos casos, y es mucho mejor por hacerlo.)
Andrzej Doyle
71

Aquí está la razón.

En Clean Code de Robert Martin , escribe que devolver nulo es un mal diseño cuando en su lugar puede devolver, digamos, una matriz vacía. Dado que el resultado esperado es una matriz, ¿por qué no? Le permitirá iterar sobre el resultado sin condiciones adicionales. Si es un número entero, tal vez sea suficiente 0, si es un hash, un hash vacío. etc.

La premisa es no forzar el código de llamada para manejar inmediatamente los problemas. Es posible que el código de llamada no quiera preocuparse por ellos. Por eso, en muchos casos, las excepciones son mejores que nulas.

Max Chernyak
fuente
2
Este es el patrón de objeto nulo mencionado en esta respuesta: stackoverflow.com/questions/1274792/…
Scott Dorman
La idea aquí es que, por error, devuelve una versión vacía / en blanco del tipo de objeto que devolvería normalmente. Una matriz o cadena vacía funcionaría para esos casos, por ejemplo. Devolver "NULL" es apropiado cuando normalmente devolvería un puntero (ya que NULL es esencialmente un puntero vacío). Devolver NULL por error de una función que normalmente devuelve, por ejemplo, un hash puede ser confuso. Algunos idiomas manejan esto mejor que otros, pero en general, la coherencia es la mejor práctica.
bta
No necesariamente devuelve un error, a menos que el error controle de alguna manera el flujo (que no es una buena práctica) o se abstraiga en la API o la interfaz. Los errores están ahí para propagarse a cualquier nivel en el que decida atraparlo, por lo tanto, no tiene que lidiar con él en el contexto de la llamada. Son por defecto null-object-pattern-friendly.
Max Chernyak
Desafortunadamente, el código de llamada no siempre considera el caso de una colección vacía (al igual que no considera el caso nulo). Eso puede o no ser un problema.
Sridhar Sarnobat
38

Buenos usos de devolver nulo:

  • Si nulo es un resultado funcional válido , por ejemplo: FindFirstObjectThatNeedsProcessing () puede devolver nulo si no se encuentra y la persona que llama debe verificar en consecuencia.

Malos usos: tratar de reemplazar u ocultar situaciones excepcionales como:

  • atrapar (...) y devolver nulo
  • Inicialización de dependencia de API fallida
  • Sin espacio en disco
  • Parámetros de entrada no válidos (error de programación, las entradas deben ser desinfectadas por la persona que llama)
  • etc.

En esos casos, lanzar una excepción es más adecuado ya que:

  • Un valor de retorno nulo no proporciona información de error significativa
  • La persona que llama inmediatamente probablemente no pueda manejar la condición de error
  • No hay garantía de que la persona que llama esté buscando resultados nulos

Sin embargo, las Excepciones no deben usarse para manejar condiciones normales de operación del programa tales como:

  • Nombre de usuario / contraseña no válidos (o cualquier entrada proporcionada por el usuario)
  • Romper bucles o como gotos no locales
ZeroConcept
fuente
77
Sin embargo, "nombre de usuario no válido" parece ser una buena causa para una excepción.
Thilo
11
Los usuarios que ingresan nombres de usuario / contraseñas inválidos no deben ser tratados como condiciones excepcionales, es parte del funcionamiento normal del programa. Sin embargo, el sistema de autenticación que no responde (por ejemplo, el directorio activo) es una condición excepcional.
ZeroConcept
2
Yo diría que depende: boolean login(String,String)parece estar bien y también lo haceAuthenticationContext createAuthContext(String,String) throws AuthenticationException
sfussenegger
1
En su ejemplo, si no hay un primer objeto que necesite procesamiento, entonces hay dos formas razonables de manejar ese caso. El primero es el patrón de objeto nulo. Cree una subclase final que represente una versión inexistente de la clase. Tiene valores predeterminados razonables y arroja excepciones cuando se solicitan acciones sin sentido. La otra técnica es la opción. Esto es lo que está disponible en Java8 y Scala. Cualquiera de estos muestra la intención de los desarrolladores. nulo no puede mostrar intención porque tiene demasiados significados posibles. ** Mostrar intención ** es el aspecto más importante del código.
Scott m Gardner
29

Sí, devolver NULL es un diseño terrible , en un mundo orientado a objetos. En pocas palabras, el uso NULL conduce a:

  • manejo de errores ad-hoc (en lugar de excepciones)
  • semántica ambigua
  • falla lenta en lugar de rápida
  • pensamiento de computadora en lugar de pensamiento de objeto
  • objetos mutables e incompletos

Consulte esta publicación de blog para obtener una explicación detallada: http://www.yegor256.com/2014/05/13/why-null-is-bad.html . Más en mi libro Elegant Objects , Sección 4.1.

yegor256
fuente
2
Estoy totalmente de acuerdo Ni siquiera me gusta el patrón de objeto nulo que parece ser una táctica de retraso de 'blanqueo'. O se supone que su método siempre tiene éxito o puede que no. Si siempre debe tener éxito, entonces tirar. Si no tiene éxito, entonces diseñe el método para que el consumidor lo sepa, por ejemplo, bool TryGetBlah(out blah)or FirstOrNull()o MatchOrFallback(T fallbackValue).
Luke Puplett
A mí tampoco me gusta volver nulo. Está separando la causa raíz del síntoma, lo que dificulta la depuración. O bien, lanza una excepción (falla rápidamente) o llama a un método de verificación que devuelve un booleano primero (por ejemplo isEmpty()) y solo si es verdadero, llama al método. Las personas argumentan en contra de que el segundo dice que es un rendimiento inferior, pero como dice la filosofía de Unix, "valorar el tiempo humano sobre el tiempo de la máquina" (es decir, el rendimiento trivialmente más lento desperdicia menos tiempo que los desarrolladores que depuran el código que está dando errores espurios).
Sridhar Sarnobat
22

¿Quién dice que este es un mal diseño?

La comprobación de nulos es una práctica común, incluso recomendada, de lo contrario corre el riesgo de NullReferenceExceptions en todas partes. Es mejor manejar el error con gracia que lanzar excepciones cuando no es necesario.

Brandon
fuente
11
+1. El código que arroja excepciones para problemas que pueden mitigarse en el acto me entristece.
jkeys
66
¿Qué tan triste se pone cuando los codificadores olvidan buscar nulos y luego obtienen misteriosas excepciones de puntero nulo? Excepciones marcadas, donde el compilador le recuerda al usuario que no se ocupó de las condiciones de error, evite una clase de errores de codificación.
djna
3
@djna: Supongo que esto también es triste, pero he descubierto que el mismo tipo de codificadores que "olvidan" verificar los nulos son los que cuando se enfrentan a excepciones verificadas con frecuencia terminan tragándolos.
Randy apoya a Monica el
55
Es más fácil detectar la presencia de un bloque de captura vacío que la ausencia de un cheque nulo.
Preston
20
@Preston: Estoy totalmente en desacuerdo. Ausencia de un cheque nulo que detectará de inmediato, cuando se bloquea. Excepciones tragados pueden propagar errores misteriosos y sutiles durante años ...
Beska
18

Según lo que has dicho hasta ahora, creo que no hay suficiente información.

Devolver nulo desde un método CreateWidget () parece malo.

Devolver nulo de un método FindFooInBar () parece estar bien.

jcollum
fuente
44
Similar a mi convención: consultas de elementos individuales: Create... devuelve una nueva instancia o arroja ; Get...devuelve una instancia existente esperada o arroja ; GetOrCreate...devuelve una instancia existente, o una nueva instancia si no existe, o arroja ; Find...devuelve una instancia existente, si existe, onull . Para consultas de colección: Get... siempre devuelve una colección, que está vacía si no se encuentran elementos coincidentes.
Johann Gerell
NULL es malo por las razones dadas en yegor256 y la respuesta de hakuinin, devolver un objeto válido pero vacío simplifica el razonamiento general
Rob11311
12

Su inventor dice que es un error de mil millones de dólares!

Bahadır Yağan
fuente
10

Depende del idioma que estés usando. Si está en un lenguaje como C # donde la forma idiomática de indicar la falta de un valor es devolver nulo, entonces devolver nulo es un buen diseño si no tiene un valor. Alternativamente, en idiomas como Haskell que usan idiomáticamente la mónada tal vez para este caso, entonces devolver nulo sería un mal diseño (si fuera posible).

Greg Beech
fuente
2
+1 por mencionar tal vez mónada. Creo que la definición de nulllenguajes como C # y Java a menudo se sobrecargan y se les da algún significado en el dominio. Si busca la nullpalabra clave en las especificaciones del idioma, simplemente significa "un puntero no válido". Eso probablemente no significa nada en ningún dominio problemático.
MattDavey
El problema es que no sabe si es un "valor perdido" nullo "no inicializado"null
CervEd
5

Si lee todas las respuestas, queda claro que la respuesta a esta pregunta depende del tipo de método.

En primer lugar, cuando ocurre algo excepcional (IOproblem, etc.), lógicamente se lanzan excepciones. Cuando exactamente algo es excepcional es probablemente algo para un tema diferente.

Cuando se espera que un método posiblemente no tenga resultados, hay dos categorías:

  • Si es posible devolver un valor neutral, hágalo .
    Enumables vacíos, cadenas, etc. son buenos ejemplos
  • Si tal valor neutral no existe, se debe devolver nulo .
    Como se mencionó, se supone que el método posiblemente no tenga ningún resultado, por lo que no es excepcional, por lo tanto, no debe arrojar una excepción. No es posible un valor neutral (por ejemplo: 0 no es especialmente un resultado neutral, dependiendo del programa)

Hasta que tengamos una manera oficial de denotar que una función puede o no devolver nulo, trato de tener una convención de nomenclatura para denotarlo.
Al igual que tiene la convención Try Something () para los métodos que se espera que fallen, a menudo llamo a mis métodos Safe Something () cuando el método devuelve un resultado neutral en lugar de nulo.

Todavía no estoy completamente de acuerdo con el nombre, pero no se me ocurrió nada mejor. Así que estoy corriendo con eso por ahora.

Boris Callens
fuente
4

Tengo una convención en esta área que me sirvió bien

Para consultas de un solo artículo:

  • Create...devuelve una nueva instancia o arroja
  • Get...devuelve una instancia existente esperada o arroja
  • GetOrCreate...devuelve una instancia existente, o una nueva instancia si no existe, o arroja
  • Find...devuelve una instancia existente, si existe, onull

Para consultas de recopilación:

  • Get... siempre devuelve una colección, que está vacía si no se encuentran elementos coincidentes [1]

[1] dados algunos criterios, explícitos o implícitos, dados en el nombre de la función o como parámetros.

Johann Gerell
fuente
¿Por qué GetOne y FindOne vuelven diferentes si no se encuentran?
Vladimir Vukanac
Describí la diferencia. Lo uso Getcuando espero que esté allí, de modo que si no está allí, entonces es un error y arrojo, nunca necesito verificar el valor de retorno. Lo uso Findsi realmente no sé si está ahí o no, entonces necesito verificar el valor de retorno.
Johann Gerell
3

Las excepciones son por circunstancias excepcionales .

Si su función está destinada a encontrar un atributo asociado con un objeto dado, y ese objeto no tiene dicho atributo, puede ser apropiado devolver nulo. Si el objeto no existe, lanzar una excepción puede ser más apropiado. Si la función está destinada a devolver una lista de atributos, y no hay ninguno a devolver, tiene sentido devolver una lista vacía: está devolviendo todos los atributos cero.


fuente
1
Si intenta usar un atributo sin valor, eso merece una excepción. (Supongo que su especificación dice que el atributo es opcional). Tenga un método separado para verificar si se ha establecido su valor.
Preston el
3

Está bien devolver nulo si hacerlo es significativo de alguna manera:

public String getEmployeeName(int id){ ..}

En un caso como este, es significativo devolver nulo si la identificación no corresponde a una entidad existente, ya que le permite distinguir el caso en el que no se encontró coincidencia de un error legítimo.

La gente puede pensar que esto es malo porque se puede abusar de él como un valor de retorno "especial" que indica una condición de error, que no es tan buena, un poco como devolver códigos de error de una función pero confuso porque el usuario tiene que verificar el retorno para nulo, en lugar de detectar las excepciones apropiadas, p. ej.

public Integer getId(...){
   try{ ... ; return id; }
   catch(Exception e){ return null;}
}
Steve B.
fuente
3
Sip. Si tienes una condición de error, lanza una excepción.
David Thornley
3
Este es un caso en el que se justificaría una excepción. Si solicita el nombre de un empleado que no existe, es obvio que algo va mal.
Thorarin
Creo que es un poco literal, Thorarin: puedes discutir con mi ejemplo, sin duda, pero estoy seguro de que puedes imaginar alguna instancia de una función que devuelve un valor coincidente, o nula si no hay coincidencia. ¿Qué tal obtener un valor de una clave en una tabla hash? (debería haber pensado en ese ejemplo en primer lugar).
Steve B.
1
Una tabla hash que devuelve nulo para una clave que no existe es mala. Hacerlo automáticamente significa que no puede almacenar un valor nulo sin un código inconsistente.
RHSeeger
3

No es necesariamente un mal diseño, ya que con tantas decisiones de diseño, depende.

Si el resultado del método es algo que no tendría un buen resultado en el uso normal, devolver nulo está bien:

object x = GetObjectFromCache();   // return null if it's not in the cache

Si realmente siempre debería haber un resultado no nulo, entonces sería mejor lanzar una excepción:

try {
   Controller c = GetController();    // the controller object is central to 
                                      //   the application. If we don't get one, 
                                      //   we're fubar

   // it's likely that it's OK to not have the try/catch since you won't 
   // be able to really handle the problem here
}
catch /* ... */ {
}
Michael Burr
fuente
2
Aunque puede registrar un error de diagnóstico allí mismo, tal vez vuelva a lanzar la excepción. En algún momento, la captura de datos por primera falla puede ser muy útil.
djna
O envuelva la excepción en una RuntimeException con información de diagnóstico en la cadena del mensaje. Mantenga la información junta.
Thorbjørn Ravn Andersen
Ahora (en 2018) ya no puedo estar de acuerdo y en tales casos deberíamos favorecer el regresoOptional<>
Piotr Müller
2

Para ciertos escenarios, desea notar una falla tan pronto como suceda.

Verificar contra NULL y no afirmar (para errores del programador) o arrojar (para errores del usuario o de la persona que llama) en el caso de falla puede significar que los bloqueos posteriores son más difíciles de rastrear, porque no se encontró el caso impar original.

Además, ignorar los errores puede conducir a vulnerabilidades de seguridad. Quizás la nulidad vino del hecho de que se sobreescribió un búfer o similar. Ahora, usted está no estrellarse, lo que significa que el explotador tiene la oportunidad de ejecutar en el código.

Drew Hoskins
fuente
2

¿Qué alternativas ves para volver nulo?

Veo dos casos:

  • findAnItem (id). ¿Qué debe hacer esto si no se encuentra el artículo?

En este caso podríamos: Devolver nulo o lanzar una excepción (marcada) (o tal vez crear un artículo y devolverlo)

  • listItemsMatching (criterios) ¿qué debería devolver esto si no se encuentra nada?

En este caso, podríamos devolver Null, devolver una lista vacía o lanzar una excepción.

Creo que el retorno nulo puede ser menos bueno que las alternativas porque requiere que el cliente recuerde verificar si hay nulo, los programadores olvidan y codifican

x = find();
x.getField();  // bang null pointer exception

En Java, lanzar una excepción marcada, RecordNotFoundException, permite que el compilador le recuerde al cliente que trate con el caso.

Creo que las búsquedas que devuelven listas vacías pueden ser bastante convenientes: simplemente complete la pantalla con todos los contenidos de la lista, oh, está vacía, el código "simplemente funciona".

djna
fuente
3
Lanzar excepciones para indicar una condición que se espera que ocurra durante el flujo normal del programa conduce a un código realmente feo, del tipo try {x = find ()} catch (RecordNotFound e) {// do stuff}.
quant_dev
Devolver listas vacías es una buena solución, pero solo cuando el método está en un contexto que puede devolver listas. Para situaciones "findById", debe devolver nulo. No me gustan las excepciones RecordNotFound.
Thilo
Así que ese es el quid de nuestra diferencia en opinión. A mis ojos no hay mucha diferencia en belleza entre x = find (); if (x = null) {work} else {do ​​stuff} e intente atrapar. Y, si es necesario, estoy dispuesto a sacrificar la belleza por la corrección del código. Con demasiada frecuencia en mi vida me encuentro con un código donde los valores de retorno no se han verificado.
djna
1

A veces, devolver NULL es lo correcto, pero específicamente cuando se trata de secuencias de diferentes tipos (matrices, listas, cadenas, lo que tienes), probablemente sea mejor devolver una secuencia de longitud cero, ya que conduce a un código más corto y, con suerte, más comprensible, sin tener que escribir mucho más por parte del implementador de la API.

Vatine
fuente
1

La idea básica detrás de este hilo es programar a la defensiva. Es decir, código contra lo inesperado. Hay una variedad de respuestas diferentes:

Adamski sugiere mirar el Patrón de Objetos Nulos, con esa respuesta votada por esa sugerencia.

Michael Valenty también sugiere una convención de nombres para decirle al desarrollador lo que se puede esperar. ZeroConcept sugiere un uso adecuado de Exception, si ese es el motivo del NULL. Y otros.

Si hacemos la "regla" de que siempre queremos hacer una programación defensiva, entonces podemos ver que estas sugerencias son válidas.

Pero tenemos 2 escenarios de desarrollo.

Clases "autorizadas" por un desarrollador: El autor

Clases "consumidas" por otro (quizás) desarrollador: el Desarrollador

Independientemente de si una clase devuelve NULL para métodos con un valor de retorno o no, el desarrollador deberá probar si el objeto es válido.

Si el desarrollador no puede hacer esto, entonces esa Clase / método no es determinista. Es decir, si la "llamada al método" para obtener el objeto no hace lo que "anuncia" (por ejemplo, getEmployee), ha roto el contrato.

Como autor de una clase, siempre quiero ser tan amable y defensivo (y determinista) al crear un método.

Entonces, dado que NULL o NULL OBJECT (p. Ej., Si (employee como NullEmployee.ISVALID)) deben verificarse y eso puede suceder con una colección de Empleados, entonces el enfoque de objeto nulo es el mejor enfoque.

Pero también me gusta la sugerencia de Michael Valenty de nombrar el método que DEBE devolver nulo, por ejemplo, getEmployeeOrNull.

Un autor que lanza una excepción está eliminando la opción para que el desarrollador pruebe la validez del objeto, lo cual es muy malo en una colección de objetos, y obliga al desarrollador a manejar excepciones al bifurcar su código de consumo.

Como desarrollador que consume la clase, espero que el autor me brinde la capacidad de evitar o programar la situación nula a la que se enfrentan sus clases / métodos.

Entonces, como desarrollador, programaría defensivamente contra NULL desde un método. Si el autor me ha dado un contrato que siempre devuelve un objeto (el OBJETO NULO siempre lo hace) y ese objeto tiene un método / propiedad por el cual probar la validez del objeto, entonces usaría ese método / propiedad para continuar usando el objeto de lo contrario, el objeto no es válido y no puedo usarlo.

La conclusión es que el Autor de la Clase / Métodos debe proporcionar mecanismos que un Desarrollador pueda usar en su programación defensiva. Es decir, una intención más clara del método.

El desarrollador siempre debe usar programación defensiva para probar la validez de los objetos devueltos por otra clase / método.

Saludos

GregJF

GregJF
fuente
0

Otras opciones para esto son: devolver algún valor que indique éxito o no (o tipo de error), pero si solo necesita un valor booleano que indicará éxito / falla, devolverá nulo para falla y un objeto para éxito no ser menos correcto, luego devolver verdadero / falso y obtener el objeto a través del parámetro.
Otro enfoque sería utilizar excepciones para indicar fallas, pero aquí, en realidad, hay muchas más voces que dicen que esta es una práctica MALA (ya que el uso de excepciones puede ser conveniente pero tiene muchas desventajas).
Por lo tanto, personalmente no veo nada malo en devolver nulo como indicación de que algo salió mal y verificarlo más tarde (para saber realmente si ha tenido éxito o no). Además, pensar ciegamente que su método no devolverá NULL y luego basará su código en él, puede dar lugar a otros errores, a veces difíciles de encontrar (aunque en la mayoría de los casos simplemente bloqueará su sistema :), como hará referencia a 0x00000000 tarde o temprano).

Marcin Deptuła
fuente
0

Las funciones nulas no intencionadas pueden surgir durante el desarrollo de programas complejos y, como el código muerto, tales ocurrencias indican fallas graves en las estructuras de los programas.

Una función o método nulo se usa a menudo como el comportamiento predeterminado de una función revectable o método reemplazable en un marco de objeto.

Función_nula @wikipedia

Scripter jugoso
fuente
0

Bueno, de seguro depende del propósito del método ... A veces, una mejor opción sería lanzar una excepción. Todo depende de un caso a otro.

Denis Biondic
fuente
0

Si el código es algo como:

command = get_something_to_do()

if command:  # if not Null
    command.execute()

Si tiene un objeto ficticio cuyo método execute () no hace nada, y devuelve eso en lugar de Nulo en los casos apropiados, no tiene que verificar el caso Nulo y, en su lugar, solo puede hacer:

get_something_to_do().execute()

Entonces, aquí el problema no es entre verificar NULL frente a una excepción, sino entre que la persona que llama tiene que manejar los casos especiales de manera diferente (de cualquier manera) o no.

Luego
fuente
0

Para mi caso de uso, necesitaba devolver un Mapa del método y luego buscar una clave específica. Pero si devuelvo un mapa vacío, conducirá a NullPointerException y no será muy diferente devolver nulo en lugar de un mapa vacío. Pero a partir de Java8 en adelante podríamos usar Opcional . Lo anterior es la razón por la cual se introdujo el concepto opcional.

Aman Gupta
fuente
-3

G'day

Devolver NULL cuando no puede crear un nuevo objeto es una práctica estándar para muchas API.

¿Por qué demonios es un mal diseño? No tengo idea.

Editar: Esto es cierto para los lenguajes en los que no tiene excepciones, como C, donde ha sido la convención durante muchos años.

HTH

'Avahappy,

Rob Wells
fuente
2
Si no puede crear un objeto, realmente debería lanzar una excepción. Si no puede encontrar un objeto que coincida con alguna consulta, entonces devolver el valor nulo es el camino a seguir.
Thilo
@Thilo, muéstrame cómo hacerlo en C y estaré más interesado.
Rob Wells el
@RobWells C no es un lenguaje orientado a objetos, pero esta pregunta está etiquetada como "oop"
yegor256
@ yegor256 Tienes razón. Y me perdí la etiqueta original de OOP. Pero, como BS dijo, una clase en C ++ es solo una estructura con algunas funciones miembro adicionales agregadas y una administración de memoria sofisticada que ocurre internamente. Pero si se supone que una API devuelve una estructura, a menudo la convención es devolver NUL cuando no puede crear la estructura.
Rob Wells