Objeto não inicializado vs objeto inicializado como NULL

93

Estou trabalhando em Java.

Costumo configurar alguns objetos como:

public class Foo {
    private SomeObject someName;

    // do stuff

    public void someMethod() {
        if (this.someName != null) {
            // do some stuff
        }
    }
}

A questão é: someNameNeste exemplo, é igualado a null, já que posso reliably for all objectsassumir que a verificação de nulos objetos não inicializados serão precisos?

SnakeDoc
fonte

Respostas:

115

Correto, os membros estáticos e de instância do tipo de referência não explicitamente inicializados são configurados nullpor Java. A mesma regra se aplica aos membros da matriz.

Na Especificação da linguagem Java , seção 4.12.5:

Valores iniciais das variáveis

Cada variável em um programa deve ter um valor antes de seu valor ser usado:

Cada variável de classe, variável de instância ou componente de matriz é inicializado com um valor padrão quando é criado

[...] Para todos os tipos de referência, o valor padrão é null.

Observe que a regra acima exclui variáveis ​​locais: elas devem ser inicializadas explicitamente, caso contrário, o programa não será compilado.

dasblinkenlight
fonte
como isso se aplica a, por exemplo char,? Eu posso fazer, char test;mas nãochar test = null;
xorinzor
1
@xorinzor Você não pode atribuir nulla charporque é um tipo primitivo. Além disso, você não pode fazer char test;dentro de um método sem atribuir testposteriormente. Você pode fazer char test='a'se quiser ou deixar como char test;em uma declaração de membro para obter o valor padrão de '\0'.
dasblinkenlight
14

Se uma Objectreferência foi declarada, mas não instanciada, seu valor é null.

Jared Nielsen
fonte
8
Apenas como um campo de instância de uma classe.
Sotirios Delimanolis
1
@SotiriosDelimanolis pode me explicar, por favor? Estou tentando aprender :)
SnakeDoc
5
@SnakeDoc Se você declarar um Object no corpo de um método, obterá um erro de compilação se tentar usá-lo sem inicializá-lo primeiro.
Sotirios Delimanolis
9
Vale a pena ser preciso aqui - você nunca declara um objeto. Você declara uma variável . Eles não são a mesma coisa.
Jon Skeet
7
@SotiriosDelimanolis, desculpe por trazer à tona uma discussão realmente antiga, mas por acaso você tem uma referência de por que eles decidiram que isso deveria causar um erro de compilação, em vez de apenas fazer com que fosse inicializado nullcomo um campo de instância?
childofsoong
-1
namespace Design
     {
              class Program
              {

                static void Main(string[] args)
                {
                  Logger obj1;   // By Default, the value of obj1 is null
                  Logger obj2 = new Logger();  // By Default the value of obj2 is 
                                               // Design.Logger which is not null
                  Console.WriteLine(obj2); 
                  Console.Read();
                }
              }

     class Logger
           {
             public Logger()
              {
                 Console.writeline("Called");
              }   
            }
        }
Alexander Zaldostanov
fonte