在我的一个课程中,我有很多像这样的构造函数。
public MyData(int position,String songName,String duration, boolean e) {
//initialization of above variable like int, string,string and boolean
}
public MyData(String songName, String artistName, String duration,String downloadPath, String songSize, String albumName,String url,String trackId, boolean e)
{
//initialization of above variable like String,String,String,String,String,String,String,String and boolean
}
还有一些更像上面的内容。 现在是调用时间,我只调用那个我需要数据的构造函数。但我不认为我的流程是好的,所以我需要一些帮助来减少我的代码以及创建良好的流程。 如果有人有良好的流程来实现这一点,那么请分享。
提前致谢。
答案 0 :(得分:5)
假设您正在有效地应用默认值,通常最好的方法是使用一个“完整”构造函数并让其他人调用它。例如:
public Foo(String name)
{
// Default the description to null
this(name, null);
}
public Foo(String name, String description)
{
this.name = name;
this.description = description;
}
在重载构造函数方面,你仍然会遇到很多错误,但至少每个“额外”构造函数都不包含实际代码 - 只是调用另一个构造函数。如果可能,将构造函数链接在一起,以便任何特定值的默认值仅在一个位置指定 - 或使用常量。这样你就可以保持一致。
另一种选择是在构建器模式之后使用“参数对象” - 创建另一个类,其唯一目的是保存构造函数参数的数据。这应该是可变的,使用所有不同值的setter。通常,让setter返回构建器是有用的,因此您可以使用:
FooParameters parameters = new FooParameters()
.setName("some name")
.setDescription("some description");
// Either a constructor call at the end, or give FooParameters
// a build() or create() method
Foo foo = new Foo(parameters);
如果您构建的主类型是不可变类型,这将特别有用 - 这意味着您可以在调用代码中应用条件逻辑来设置一些参数而不是其他参数。 Java框架本身在ProcessBuilder
中使用这种方法,虽然我个人并不热衷于重载方法名称以返回值或根据您是否提供参数设置值:(
请注意最终片段中构造函数调用上方的注释 - 如果您的帮助程序类仅对创建单个类型的对象有帮助,则可以为其提供额外的方法(build
,create
,start
,无论什么是最合适的)代替构造函数调用。这允许您以流畅的方式构建整个最终对象。
构建器模式的Java实现中的一个选项是使用嵌套类型,例如
Foo foo = new Foo.Builder().setName(...).setDescription(...).build();
这样可以避免使用另一个 类来构建Foo
的实例,从而污染您的包。
答案 1 :(得分:3)
您可能希望拥有另一个负责通过构建器模式创建对象的对象。例如,您可以像这样定义一个对象:
public class SongBuilder {
private String artistName;
private String songTitle;
/* ... everything else ... */
public SongBuilder setArtistName(String name) {
this.artistName = name;
return this;
}
public SongBuilder setSongTitle(String title) {
this.songTitle = title;
return this;
}
/* ... everything else ... */
public Song create() {
return new Song(artistName, songTitle, /* ... everything else ... */);
}
}
然后,您可以为Song
定义一个接收所有数据的构造函数。要制作Song
,您可以编写
Song s = new SongBuilder().setSongTitle("Still Alive").setArtistName("GLaDOS").create();
这种方法的优点是您可以为所有参数设置合理的默认值,然后只为实际使用的参数调用相应的set
函数。它还允许您轻松添加新参数,而无需返回并重写重要代码。
或者,正如Jon Skeet指出的那样,你可以拥有多个相互调用的构造函数。构建器模式优于此方法的优点是,如果您有n个不同的参数,则需要编写2个 n 构造函数组合,而您只需要一个构建器。
希望这有帮助!