I pode adicionar a uma lista particular diretamente através do getter?

StackOverflow https://stackoverflow.com/questions/895257

  •  23-08-2019
  •  | 
  •  

Pergunta

Eu percebo que eu vou ficar inflamado por não simplesmente escrever um teste de mim ... mas estou curioso sobre as opiniões das pessoas, e não apenas a funcionalidade, então ... aqui vai ...

Eu tenho uma classe que tem uma lista privada. Quero acrescentar a essa lista privado, através do método público getMyList ().

então ... vai funcionar isso?

public class ObA{
 private List<String> foo;
public List<String> getFoo(){return foo;}
}

public class ObB{
   public void dealWithObAFoo(ObA obA){
     obA.getFoo().add("hello");

   }
}
Foi útil?

Solução

Sim, isso será absolutamente trabalho - que é normalmente uma coisa ruim. (Isso é porque você está realmente retornando um referência para o objeto de coleção, não uma cópia da própria coleção.)

Muitas vezes você deseja fornecer genuinamente acesso somente leitura a uma coleção, o que geralmente significa retornar um read-only invólucro em torno da coleção. Fazendo o tipo de retorno de uma leitura única interface implementada pela coleta e retornando a referência coleção real não fornece muita proteção: o chamador pode facilmente convertido para o tipo de coleção "real" e depois adicionar sem problemas.

Outras dicas

Na verdade, não é uma boa ideia. Não publicar seu membros mutáveis ??fora, faça uma cópia se você não pode fornecer uma versão somente leitura em tempo real ...

public class ObA{
  private List<String> foo;
  public List<String> getFoo(){return Collections.unmodifiableList(foo);}
  public void addString(String value) { foo.add(value); }
}

Se você quer uma opinião sobre como fazer isso, eu remover a chamada getFoo() e adicione um add(String msg) e remove(String msg) métodos (ou qualquer outra funcionalidade que você deseja expor) para ObA

Dar acesso a coleção sempre parece ser uma coisa ruim na minha experiência - principalmente porque eles são praticamente impossível de controlar, uma vez que sair. Eu tenho tido ao hábito de permitir que NUNCA acesso directo a colecções fora da classe que os contém.

A principal razão por trás disso é que há quase sempre algum tipo de lógica de negócios ligado à coleta de dados - por exemplo, a validação em adição ou talvez algum dia você vai precisar adicionar uma coleção segundo intimamente relacionados.

Se você permitir o acesso como você está falando, vai ser muito difícil no futuro fazer uma modificação como esta.

Oh, também, muitas vezes eu acho que eu, eventualmente, tem que armazenar um pouco mais dados com o objeto que eu estou armazenando - então eu criar um novo objeto (conhecido apenas dentro do "Container" que abriga a coleção) e I colocar o objeto dentro de que, antes de colocá-lo na coleção.

Se você manteve sua coleção bloqueado, este é um refactor trivial. Tente imaginar o quão difícil seria, em alguns casos você trabalhou de onde você não manter a coleção bloqueado ...

Se você queria para suportar funções adicionar e remover para Foo, eu gostaria de sugerir os métodos addFoo () e removeFoo (). I idealmente você poderia eliminar a getFoo em conjunto, criando um método para cada pedaço de funcionalidade que você precisa. Este deixar claro quanto às funções de um interlocutor pré-forma na lista.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top