在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++版协议缓冲区的人的个人偏好?
我在JavaWorld上发现了这篇文章,其中Allen Holub解释了Getters/Setters的替代方法,它保留了隐藏对象实现的原则(他的示例代码也可以在下面找到).
它解释了类Name/ EmployeeId/ Money应该有一个构造函数接受一个字符串 - 原因是如果你输入它int,然后需要将它改为a long,你将不得不修改类的所有用途,并且你不需要这种模式.
我想知道:这不是简单地将问题转移到解析String被抛出的参数吗?例如,如果所有使用EmployeeId(从中接收Exporter)的代码解析String成一个int,并且突然开始导出long值,则需要完全修改使用的数量......如果你开始解析long它可能就好了改为a double(即使这对id没有意义)......如果你不能确定要解析什么String,你就无法实现任何东西.
除了这个问题,我还有另一个问题:我意识到这篇文章已有七年多的历史了,所以有人能指出我最近关于OO设计的一些概述,特别是关于getter/setter和实现隐藏辩论的想法吗?
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) 我一直在研究一个软件,我需要生成一个自定义XML文件以发送回客户端应用程序.Ruby/Rails世界上用于生成XML文件的当前解决方案充其量是缓慢的.使用构建器或事件Nokogiri,虽然具有良好的语法和可维护的解决方案,但它们会消耗太多时间和处理.
我绝对可以去ERB,它以牺牲手工构建整个XML为代价提供了很好的速度.
HAML是一个很棒的工具,具有良好而直接的语法并且相当快.但我正在努力使用它来构建纯XML文件.这让我想知道,它有可能吗?
有没有人对某些代码或文档有一些指示,说明如何执行此操作,从HAML构建完整,有效的XML?
我已经开始阅读Joshua Bloch的"Effective Java"(第二版).在阅读第2项时(在面对许多构造函数参数时考虑构建器),有一个特定的声明,即作者使用了Class.newInstance()方法.具体来说,作者说
Java中的传统抽象工厂实现一直是"类"对象,"newInstance"方法扮演"构建"方法的一部分.
这部分让我感到困惑 - 我对抽象工厂设计模式的理解是它用来代表工厂的工厂.该Class.newInstance()方法,在我看来,边框上的"静态工厂方法"编码理念(这顺便说一句,在同一本书第1项)以上
思绪,有人吗?我一直在努力克服一些艰难的采访,如果我的基本面在出现进行此类采访之前是稳固的话,我会非常感激.
谢谢.
我们通常在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)
所以,我的问题是,有一种优雅的方式来实现这一目标吗?
我一直想知道是否可以更优雅地使用可选参数构建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行
目前我有这三个类:
@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) 您好,我正在通过两个操作设置来电通知:接听和拒绝。我需要为 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() ,但它为这两个操作设置了唯一的颜色。
请帮我解决这个问题。提前致谢
假设你创建一个使用生成器模式的人一个类名,并假设生成器类包含的方法body(),head(),arms()当然build(),你考虑的方法head(),并build()为这个类的用户必须的.
我们想以某种方式标记这些方法是强制性的,如果可能的话使用注释.如果这个类的用户试图构建一个Person实例但是忘了调用这些方法中的任何一个,我们希望得到某种警告 - 无论是来自java编译器,还是来自我们用来构建我们的Eclipse或Maven项目 - 他们中的任何一个都可以.
有可能吗?你会建议哪种方式?
builder ×10
java ×8
android ×1
annotations ×1
c++ ×1
clojure ×1
haml ×1
lombok ×1
nbuilder ×1
oop ×1
reflection ×1
ruby ×1
unit-testing ×1
xml ×1