Tag: builder

建筑师设计模式的缺点

使用构建器设计模式的缺点是什么。 有没有? 编辑 – 我想知道使用构建器设计模式是否有任何不良后果? 与GOF书中一样,他们提到了设计模式的好坏后果。 但他们没有提到建筑师设计模式的任何不良后果。

HTTP Builder / Groovy – 丢失302(重定向)处理?

我在这里阅读http://groovy.codehaus.org/modules/http-builder/doc/handlers.html “在响应发送重定向状态代码的情况下,这由Apache HttpClient内部处理,默认情况下只是通过将请求重新发送到新url来关注重定向。您无需执行任何特殊操作即可遵循302响应。“ 当我只使用没有闭包的get()或post()方法时,这似乎工作正常。 但是,当我使用一个闭包时,我似乎失去了302处理。 我有办法自己处理吗? 谢谢 ps这是我的日志输出,显示它是302响应 [java] FINER: resp.statusLine: “HTTP/1.1 302 Found” 这是相关的代码: // Copyright (C) 2010 Misha Koshelev. All Rights Reserved. package com.mksoft.fbbday.main import groovyx.net.http.ContentType import java.util.logging.Level import java.util.logging.Logger class HTTPBuilder { def dataDirectory HTTPBuilder(dataDirectory) { this.dataDirectory=dataDirectory } // Main logic def logger=Logger.getLogger(this.class.name) def closure={resp,reader-> logger.finer(“resp.statusLine: \”${resp.statusLine}\””) if (logger.isLoggable(Level.FINEST)) { def respHeadersString=’Headers:’; […]

调整Builder模式以进行方法调用

这是尝试从Effective Java 2nd Edition中仔细理解ITEM 40:设计方法签名的一部分。 建议改进方法签名可读性的一个目的是瞄准四个或更少的参数。 建议使用多种技术管理较长的参数列表,其中一种技术如下: 结合前两个方面的第三种技术是使Builder模式(第2项)从对象构造适应方法调用。 如果你有一个包含许多参数的方法,特别是如果它们中的一些是可选的,那么定义一个代表所有参数的对象并允许客户端对这个对象进行多次“setter”调用是有益的。它设置单个参数或小的相关组。 一旦设置了所需的参数,客户端就会调用对象的“执行”方法,该方法对参数进行任何最终有效性检查并执行实际计算。 我熟悉Builder模式,因为它用于构造对象,但我不确定我是否正确理解了如何使其适应方法调用。 这是我到目前为止: (我试图改进move方法的方法调用) public class Space { public static class Builder { // Required parameters private final int x; private final int y; private final int z; // optional params private long time = 0; public Builder(int x, int y, int z) { this.x = […]

与Java 8流的生成器模式

我正在使用一个简单的循环构建一个对象: WebTarget target = getClient().target(u); for (Entry queryParam : queryParams.entrySet()) { target = target.queryParam(queryParam.getKey(), queryParam.getValue()); } 我想使用Java8 Stream API做同样的事情,但我无法弄清楚如何做到这一点。 让我奋斗的是每次都重新分配目标,所以一个简单的.forEach()将不起作用。 我想我需要使用.collect()或reduce(),因为我正在寻找单个返回值,但此刻我迷路了!

如何在方法上使用Lombok @Builder注释

我想有一个简单的方法来构建测试数据,并发现Builder模式非常适合这里描述的。 然而,为了减少组件测试中的样板代码,我发现来自Project Lombok的@Builder是一个不错的候选人。 但是,我无法找到有关如何在方法上使用它的任何文档或在线示例。 我想在某种工厂方法上使用@Builder,因为我无法对实现进行任何更改。 有人可以给出一个关于如何在方法上实际使用@Builder的考试吗?

OO上的JavaWorld:Getters / Setters vs Builder

背景: 我在JavaWorld上发现了这篇文章 ,其中Allen Holub解释了Getters / Setters的替代方法,它保留了隐藏对象实现的原则(他的示例代码也可以在下面找到)。 它解释了类Name / EmployeeId / Money应该有一个构造函数采用单个字符串 – 原因是如果你键入它作为int ,后来需要将它更改为long ,你将不得不修改所有用途这个模式,你没有必要。 问题1: 我想知道:这不是简单地将问题转移到解析被抛出的String参数吗? 例如,如果使用EmployeeId所有代码(从Exporter接收)将String解析为int ,并且突然开始导出long值,则需要修改完全相同的数量…并且如果您开始将其解析为很long它可能必须改为double (即使这对id没有意义)……如果你不能确定将String解析为什么,你就无法实现任何东西 。 问题2: 除了这个问题,我还有另一个问题:我意识到这篇文章已有七年多了,所以有人能指出我最近关于OO设计的一些概述,特别是关于getter / setter和实现隐藏辩论的想法吗? 清单1. Employee:Builder Context public class Employee { private Name name; private EmployeeId id; private Money salary; public interface Exporter { void addName ( String name ); void addID ( String […]

如何克隆旧构建器以创建新的构建器对象?

我有一个我正在我的项目中使用的构建器类。 假设我将metricA作为基于以下类的构建器。 我需要通过克隆metricA来制定基于metricA的新构建器metricB ,以便metricB包含metricB中已经存在的所有值。 在MetricHolder的构造函数中,我正在基于已经设置的字段初始化一些字段(不是直接设置)。 clientTypeOrPayId – 我正在初始化此字段。 如果payId存在,那么我将设置此值或我将设置clientType 。 clientKey – 我也在同一个构造函数中初始化这个字段。 最重要的是,我在clientPayload地图中放置了几个必填字段。 我不确定这样做的正确方法是什么。 但我需要在地图中添加is_clientid和is_deviceid 。 (一般来说,我添加了更多的字段)。 然后在构造函数的最后一个,我计算延迟差异并将其发送到其他系统。 以下是我的课程: public final class MetricHolder { private final String clientId; private final String deviceId; private final String payId; private final String clientType; private final String clientTypeOrPayId; private final Schema schema; private final String schemaId; private final […]

如何在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 […]