相关疑难解决方法(0)

如何在Java 8中实现构建器模式?

我常常发现使用pre-java-8设置实现构建器模式很繁琐.总是有很多几乎重复的代码.构建器本身可以被视为样板.

事实上,有代码重复检测器,几乎可以考虑使用pre-java-8工具制作的构建器的每个方法作为每个其他方法的副本.

所以考虑下面的类和它的pre-java-8构建器:

public class Person {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

public class PersonBuilder {

    private static class PersonState {
        public String name;
        public int age;
    }

    private PersonState  state = new PersonState();

    public PersonBuilder withName(String name) {
        state.name = name;
        return this; …
Run Code Online (Sandbox Code Playgroud)

java builder java-8

19
推荐指数
4
解决办法
3万
查看次数

我何时应该使用构建器设计模式?

我正在学习设计模式并找到了Builder设计模式.这种设计模式有什么好处,我什么时候应该使用它?我浏览www.dofactory.comwww.blackwasp.com,但仍然不了解其好处.顺便说一下,我是设计模式的新手,所以请用简单的方法解释一下.

design-patterns

14
推荐指数
2
解决办法
1万
查看次数

Java实现构建器模式的最佳方法

以下哪项是实施构建器模式的更好方法?

1)使用对象构建而不是构建器中的所有属性(并在构建器构造器中创建它):

public class Person {
    private String firstName;
    // other properties ...

    private Person() {}

    // getters ...

    public static class Builder {
        // person object instead of all the person properties
        private Person person;

        public Builder() {
            person = new Person();
        }

        public Builder setFirstName(String firstName) {
            person.firstName = firstName;

            return this;
        }

        // other setters ...

        public Person build() {
            if (null == person.firstName) {
                throw new IllegalStateException("Invalid data.");
            }

            return person;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

2)直接在构建器中使用对象的属性来构建而不是对象(并在build()方法中创建它):

public …
Run Code Online (Sandbox Code Playgroud)

java builder

14
推荐指数
1
解决办法
3100
查看次数

Builder模式的真实示例

我想看看Builder模式在现实世界的应用程序/ API中是如何使用的.我发现的例子包括比萨饼,蛋糕,汽车等等(加上GoF书中的解析器示例).

你能否告诉我这个模式在实际应用程序/ API中的一些用法,最好是来自C++,.NET或PHP的世界(因为那些是我熟悉的语言).

谢谢.

design-patterns builder

13
推荐指数
2
解决办法
7905
查看次数

构建器模式和模板方法之间的差异(构建器与模板)

模板模式在基类中提供算法,其步骤可以在派生类中进行修改.在Builder模式中,具体构建器公开了用于构建从Director类调用的产品的方法.

我知道使用这些模式的目的有所不同.模板模式是一种行为模式,它改变模板中的一个或多个步骤,而构建器模式是创建模式.

除了上述差异外,还有其他差异吗?

构建器模式中的director不是模板模式中的基本模板.具体的构建器在模板模式中的行为类似于可替换的步骤吗?

有人可以澄清一下.谢谢.

我指的是http://www.dofactory.com/Patterns/Patterns.aspx

design-patterns builder template-method-pattern

12
推荐指数
2
解决办法
6842
查看次数

为什么在Android中使用"AlertDialog.Builder"而不是"AlertDialogBu​​ilder"的奇怪命名约定

为什么不

AlertDialogBuilder builder = new  AlertDialogBuilder(this);
builder.setTitle("foo");
Run Code Online (Sandbox Code Playgroud)

代替

AlertDialog.Builder builder = new  AlertDialog.Builder(this);
builder.setTitle("foo");
Run Code Online (Sandbox Code Playgroud)

更新:我想知道这种写作/组织背后的原因

android android-alertdialog

12
推荐指数
2
解决办法
2854
查看次数

Java继承,使用构建器模式

我有3个班:

  1. 错误
  2. ShellError
  3. WebError

哪里

ShellError extends Error 
Run Code Online (Sandbox Code Playgroud)

WebError extends Error
Run Code Online (Sandbox Code Playgroud)

ShellError某些领域中,有些领域是可选的,而其他领域则是必需的.我正在以下列方式构建对象:

shellError = new ShellError.Builder().setFile(filePattern)
.setHost(host).setPath(path).setSource(file.isSource())
.setJobName(p.getJobName()).build();
Run Code Online (Sandbox Code Playgroud)

自从ShellError延伸以来Error,我进一步:

shellError.setDescription(msg.toString());
shellError.setExceptionClass("MyEvilException");
shellError.setExceptionMessage("Some clever error message");
shellError.setStacktrace(stack);
Run Code Online (Sandbox Code Playgroud)

所以...为什么要打扰生成器呢?我喜欢这样的事实,即我的build()以及其他方面可以方便地验证所有字段是否设置得恰当等.

我会喜欢它,如果我可以... build()ShellError并添加Error类中的字段.

我做了什么工作.

  • 问题是:

有没有更好的方法,或者它有意义我做了什么?

- 编辑

我更新了Builder()以接受之前在Error类中的一些参数.我现在有

shellError = new ShellError.Builder(exception, "Some description").setFile(filePattern).setHost(host)
.setPath(path).setSource(file.isSource()).
setJobName(p.getJobName()).build();
Run Code Online (Sandbox Code Playgroud)

你说什么?更好?更差?

java inheritance

10
推荐指数
2
解决办法
5804
查看次数

重构使用Builder模式或Telescoping构造函数模式

根据Effective Java 2ed Item 2

telescoping构造函数模式,其中您提供仅具有所需参数的构造函数,另一个具有单个可选参数,第三个具有两个可选参数,依此类推,最终在具有所有可选参数的构造函数中.

应用此模式的类的构造函数的示例借用于何时使用Builder模式?

代码集1a

Pizza(int size) { ... }        
Pizza(int size, boolean cheese) { ... }    
Pizza(int size, boolean cheese, boolean pepperoni) { ... }    
Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon) { ... }
Run Code Online (Sandbox Code Playgroud)

size是必需参数.奶酪,意大利辣香肠和培根是可选参数.假设我想提供如下构造函数.

代码集1b

Pizza(int size) { ... }        
Pizza(int size, boolean cheese) { ... }    
Pizza(int size, boolean pepperoni) { ... }    
Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon, int price, int) { ... …
Run Code Online (Sandbox Code Playgroud)

parameters refactoring constructor design-patterns

10
推荐指数
1
解决办法
1万
查看次数

当我们可以使用setter做相同的事情时,为什么需要使用构建器设计模式?

public class Employee {
    private String name;
    private String address;
    private int id;

    public Employee() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public String toString() {
        return "Employee [name=" + name + ", address=" + address + ", id=" + id + "]";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getId() …
Run Code Online (Sandbox Code Playgroud)

java design-patterns

10
推荐指数
3
解决办法
995
查看次数

编写一个长构造函数有什么缺点吗?

它是否会影响加载应用程序的时间?或者这样做的任何其他问题?

oop

9
推荐指数
1
解决办法
2847
查看次数