Les initialiseurs d'objet sont cool car ils vous permettent de configurer une classe en ligne. Le compromis est que votre classe ne peut pas être immutable. Considérez :
public class Album
{
// Notez que nous rendons le setter 'private'
public string Name { get; private set; }
public string Artist { get; private set; }
public int Year { get; private set; }
public Album(string name, string artist, int year)
{
this.Name = name;
this.Artist = artist;
this.Year = year;
}
}
Si la classe est définie de cette manière, cela signifie qu'il n'y a pas vraiment de moyen facile de modifier le contenu de la classe après sa construction. L'immuabilité a des avantages. Lorsque quelque chose est immuable, il est BEAUCOUP plus facile de déterminer s'il est correct. Après tout, s'il ne peut pas être modifié après la construction, alors il n'y a aucun moyen pour qu'il soit jamais 'faux' (une fois que vous avez déterminé que sa structure est correcte). Lorsque vous créez des classes anonymes, telles que :
new {
Name = "Some Name",
Artist = "Some Artist",
Year = 1994
};
le compilateur créera automatiquement une classe immuable (c'est-à-dire que les classes anonymes ne peuvent pas être modifiées après la construction), car l'immutabilité est simplement si utile. La plupart des guides de style C++/Java encouragent souvent à rendre les membres const
(C++) ou final
(Java) pour cette raison. Les grandes applications sont juste beaucoup plus faciles à vérifier lorsqu'il y a moins de pièces mobiles.
Cela étant dit, il y a des situations où vous voulez pouvoir modifier rapidement la structure de votre classe. Disons que j'ai un outil que je veux configurer :
public void Configure(ConfigurationSetup setup);
et j'ai une classe qui a un certain nombre de membres tels que :
class ConfigurationSetup {
public String Name { get; set; }
public String Location { get; set; }
public Int32 Size { get; set; }
public DateTime Time { get; set; }
// ... et d'autres trucs de configuration...
}
L'utilisation de la syntaxe d'initialisation d'objet est utile lorsque je veux configurer une combinaison de propriétés, mais pas nécessairement toutes en une fois. Par exemple si je veux juste configurer le Name
et Location
, je peux juste faire :
ConfigurationSetup setup = new ConfigurationSetup {
Name = "Some Name",
Location = "San Jose"
};
et cela me permet de configurer une combinaison sans avoir à définir un nouveau constructeur pour chaque permutation possible.
Dans l'ensemble, je soutiendrais que rendre vos classes immuables vous fera gagner beaucoup de temps de développement à long terme, mais avoir une syntaxe d'initialisation d'objet facilite la configuration de certaines permutations de configuration.