标签: builder

Java与C++的构建者?

在Google的Protocol Buffer API for Java中,他们使用这些创建对象的很好的构建器(参见此处):

Person john =
  Person.newBuilder()
    .setId(1234)
    .setName("John Doe")
    .setEmail("jdoe@example.com")
    .addPhone(
      Person.PhoneNumber.newBuilder()
        .setNumber("555-4321")
        .setType(Person.PhoneType.HOME))
    .build();
Run Code Online (Sandbox Code Playgroud)

但是相应的C++ API不使用这样的构建器(参见这里)

C++和Java API应该做同样的事情,所以我想知道他们为什么不在C++中使用构建器.是否有语言原因,即它不是惯用的,或者在C++中不受欢迎?或者可能只是编写C++版协议缓冲区的人的个人偏好?

c++ java design-patterns builder

11
推荐指数
2
解决办法
1704
查看次数

适用于Java的nBuilder替代方案

有没有像nBuilder for java 这样的工具?

我想为单元测试构建对象,我不想为我的域中的每个实体创建一个构建器类.

我目前正在使用mockito但它并没有取代nBuilder的功能.

java unit-testing builder nbuilder

11
推荐指数
1
解决办法
874
查看次数

OO上的JavaWorld:Getters/Setters vs Builder

背景:

我在JavaWorld上发现了这篇文章,其中Allen Holub解释了Getters/Setters的替代方法,它保留了隐藏对象实现的原则(他的示例代码也可以在下面找到).

它解释了类Name/ EmployeeId/ Money应该有一个构造函数接受一个字符串 - 原因是如果你输入它int,然后需要将它改为a long,你将不得不修改类的所有用途,并且你不需要这种模式.

问题1:

我想知道:这不是简单地将问题转移到解析String被抛出的参数吗?例如,如果所有使用EmployeeId(从中接收Exporter)的代码解析String成一个int,并且突然开始导出long值,则需要完全修改使用的数量......如果你开始解析long它可能就好了改为a 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 id     );
          void addSalary  ( String salary ); …
Run Code Online (Sandbox Code Playgroud)

java oop design-patterns builder getter-setter

11
推荐指数
2
解决办法
7058
查看次数

是否可以使用Haml生成普通的XML?

我一直在研究一个软件,我需要生成一个自定义XML文件以发送回客户端应用程序.Ruby/Rails世界上用于生成XML文件的当前解决方案充其量是缓慢的.使用构建器或事件Nokogiri,虽然具有良好的语法和可维护的解决方案,但它们会消耗太多时间和处理.

我绝对可以去ERB,它以牺牲手工构建整个XML为代价提供了很好的速度.

HAML是一个很棒的工具,具有良好而直接的语法并且相当快.但我正在努力使用它来构建纯XML文件.这让我想知道,它有可能吗?

有没有人对某些代码或文档有一些指示,说明如何执行此操作,从HAML构建完整,有效的XML?

ruby xml haml ruby-on-rails builder

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

Class.newInstance()是否遵循"抽象工厂"设计模式?

我已经开始阅读Joshua Bloch的"Effective Java"(第二版).在阅读第2项时(在面对许多构造函数参数时考虑构建器),有一个特定的声明,即作者使用了Class.newInstance()方法.具体来说,作者说

Java中的传统抽象工厂实现一直是"类"对象,"newInstance"方法扮演"构建"方法的一部分.

这部分让我感到困惑 - 我对抽象工厂设计模式的理解是它用来代表工厂的工厂.该Class.newInstance()方法,在我看来,边框上的"静态工厂方法"编码理念(这顺便说一句,在同一本书第1项)以上

思绪,有人吗?我一直在努力克服一些艰难的采访,如果我的基本面在出现进行此类采访之前是稳固的话,我会非常感激.

谢谢.

java reflection builder java.lang.class

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

什么是构建模式的clojure方式?

我们通常在java中使用builder模式,如下所示:

UserBuilder userBuilder = new UserBuilder();
User John = userBuiler.setName("John")
                      .setPassword("1234")
                      .isVip(true)
                      .visableByPublic(false)
                      .build();
Run Code Online (Sandbox Code Playgroud)

某些属性具有默认值,而有些属性则没有.

在地图中传递属性可能是一种解决方案,但它会使参数真正变长:

(def john (make-user {:name "John" :pass "1234" :vip true :visible false}))
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是,有一种优雅的方式来实现这一目标吗?

design-patterns clojure builder

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

有条件包含元素的生成器

我一直想知道是否可以更优雅地使用可选参数构建Builder:

我所拥有的:具有名称,ID,年龄的对象。

我有一个复杂的条件来考虑年龄,我想在条件成功时将其发送给建造者,但我想让它带有一个带有参数的优雅衬垫。

我到目前为止所拥有的:

 Builder.name("name").id("id").age(age, complexCondition).build();
Run Code Online (Sandbox Code Playgroud)

要么

 Builder builder = Builder.name("name").id("id");
 if(complexCondition){
     builder.age(age);
 }
Run Code Online (Sandbox Code Playgroud)

有更好的选择吗?我想解决条件,而无需过度设计生成器,也无需对每个复杂的条件检查进行过度编码。

upd:我正在寻找的解决方案没有:

a)将complexChecks或boolean传递给生成器-而不是按定义检查他的工作

b)在调用builder的方法中不为每个条件检查添加3行

java design-patterns builder

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

如何在@SuperBuilder 上使用 Lombok 的 toBuilder

目前我有这三个类:

@Value
@NonFinal
@SuperBuilder
public class Parent {
    // Some fields
}

@Value
@EqualsAndHashCode(callSuper = true)
@SuperBuilder(toBuilder = true)
public class ChildA extends Parent {
    // Some fields
}

@Value
@EqualsAndHashCode(callSuper = true)
@SuperBuilder(toBuilder = true)
public class ChildB extends Parent {
    // Some fields
}
Run Code Online (Sandbox Code Playgroud)

我想在映射器中使用它如下以避免重复任何代码:

private ChildA buildChildA(Entity entity) {
    Parent parent = ((ChildB) buildParent(entity, ChildA.builder().build()))
        .toBuilder()
        // Populate Child A fields from entity
        .build();
}

private ChildB buildChildB(Entity entity) {
    Parent parent = ((ChildA) buildParent(entity, ChildA.builder().build()))
        .toBuilder() …
Run Code Online (Sandbox Code Playgroud)

java builder lombok

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

为通知操作设置不同的颜色

您好,我正在通过两个操作设置来电通知:接听和拒绝。我需要为 Answer 操作设置绿色,为 Decline 设置红色。但我找不到解决方案。

这是我的代码:

NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext,"Call")
                .setSmallIcon(R.drawable.ic_stat_rider_logo)
                .setContentIntent(contentIntent)
                .setContentTitle(generalFunc.retrieveLangLBl("","LBL_SINCH_NOTIFICATION_CONTENT"))
                .setContentText(call.getHeaders().get("Name") +" "+ generalFunc.retrieveLangLBl("","LBL_SINCH_NOTIFICATION_TITLE"));

        builder.addAction(getServiceNotificationAction(mContext, denyCallIntent(mContext,call),R.drawable.ic_call_icon, R.string.decline));
        builder.addAction(getServiceNotificationAction(mContext, answerCallIntent(mContext,call),R.drawable.com_facebook_close, R.string.answer));
 if (callActivityRestricted()) {
        builder.setFullScreenIntent(contentIntent, true);
        builder.setPriority(NotificationCompat.PRIORITY_HIGH);
        builder.setCategory(NotificationCompat.CATEGORY_CALL);
    }
 private NotificationCompat.Action getServiceNotificationAction(Context context, Intent intent, int iconResId, int titleResId) {
        PendingIntent pendingIntent = Build.VERSION.SDK_INT >= 26 ? PendingIntent.getForegroundService(context, 0, intent, 0)
                : PendingIntent.getService(context, 0, intent, 0);

        return new NotificationCompat.Action(iconResId, context.getString(titleResId), pendingIntent);
    }
Run Code Online (Sandbox Code Playgroud)

我尝试了 setColor() ,但它为这两个操作设置了唯一的颜色。

请帮我解决这个问题。提前致谢

java notifications android builder

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

如何标记方法必须?

假设你创建一个使用生成器模式的人一个类名,并假设生成器类包含的方法body(),head(),arms()当然build(),你考虑的方法head(),并build()为这个类的用户必须的.

我们想以某种方式标记这些方法是强制性的,如果可能的话使用注释.如果这个类的用户试图构建一个Person实例但是忘了调用这些方法中的任何一个,我们希望得到某种警告 - 无论是来自java编译器,还是来自我们用来构建我们的Eclipse或Maven项目 - 他们中的任何一个都可以.

有可能吗?你会建议哪种方式?

java annotations design-patterns builder

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