- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的一个项目中,我有两个装满 DTO 的包,POJO 只有 getter 和 setter。虽然它们是简单的 java bean 很重要(例如,因为 Apache CXF 使用它们来创建 Web 服务 XSD 等),但像这样编程也很糟糕且容易出错。
Foo foo = new Foo();
foo.setBar("baz");
foo.setPhleem(123);
return foo;
我更喜欢流畅的接口(interface)和构建器对象,所以我使用 maven/gmaven 自动为 DTO 创建构建器。所以对于上面的代码,一个FooBuilder
是自动生成的,我可以这样使用:
Foo foo = new FooBuilder()
.bar("baz")
.phleem(123)
.build();
我还会为生成的构建器自动生成单元测试。单元测试将生成上述两种代码(构建器版本和非构建器版本)并断言这两个版本在 equals()
方面是等价的。和 hashcode()
.我实现这一目标的方法是拥有一个全局可访问的 map ,其中包含每个属性类型的默认值。像这样:
public final class Defaults{
private Defaults(){}
private static final Map<Class<?>, Object> DEFAULT_VALUES =
new HashMap<Class<?>, Object>();
static{
DEFAULT_VALUES.put(String.class, "baz");
// argh, autoboxing is necessary :-)
DEFAULT_VALUES.put(int.class, 123);
// etc. etc.
}
public static getPropertyValue(Class<?> type){
return DEFAULT_VALUES.get(type);
}
}
另一个重要的方面是 pojo 有时有集合成员。例如:
foo.setBings(List<Bing> bings)
但在我的构建器中,我希望从这种情况下生成两个方法:一个设置方法和一个添加方法:
fooBuilder.bings(List<Bing> bings); // set method
fooBuilder.addBing(Bing bing); // add method
我通过向 Foo
中的属性字段添加自定义注释解决了这个问题
@ComponentType(Bing.class)
private List<Bing> bings;
构建器构建器 (sic) 读取注释并将该值用作要生成的方法的通用类型。
我们现在离这个问题越来越近了(抱歉,简洁不是我的优点之一:-))。
我意识到这种构建器方法可以用于多个项目,所以我正在考虑将它变成一个 maven 插件。我非常清楚如何生成 Maven 插件,所以这不是问题的一部分(也不是如何生成有效的 Java 源代码)。我的问题是:如何在不引入任何公共(public)依赖项(项目和插件之间)的情况下处理上述两个问题:
<Question>
我需要一个 Defaults 类(或类似的机制)来为生成的单元测试获取默认值(这是概念的关键部分,如果未经过全面测试,我不会信任自动生成的构建器) .请帮我想出一个好的通用方法来解决这个问题,因为每个项目都有自己的域对象。
我需要一种将泛型类型与构建器生成器通信的通用方法。我使用的当前基于注解的版本并不令人满意,因为项目和插件都需要知道相同的注解。
</Question>
有什么想法吗?
顺便说一句:我知道使用构建器的真正关键点是使对象不可变。我不能使我的不可变,因为标准的 java bean 是必需的,但我使用 AspectJ 强制在我的代码库中除了构建器之外的任何地方都不会调用设置方法和构造函数,因此出于实际目的,生成的对象是不可变的.
另外:是的,我知道现有的 Builder-generator IDE 插件。这不符合我的目的,我想要一个自动化的解决方案,只要底层代码发生变化,它就始终是最新的。
Matt B 要求提供一些有关我如何生成构建器的信息。这是我的做法:
我每次反射都读了一个类,使用 Introspector.getBeanInfo(clazz).getPropertyDescriptors()
获取属性描述符数组。我所有的构建器都有一个基类 AbstractBuilder<T>
其中 T
将是 Foo
在上述情况下。这是 the code of the Abstract Builder class .对于 PropertyDescriptor
中的每个属性数组,使用属性名称生成一个方法。这将是 FooBuilder.bar(String)
的实现:
public FooBuilder bar(String bar){
setProperty("bar", bar);
return this;
}
build()
AbstractBuilder
中的方法实例化对象并在其属性映射中分配所有属性。
最佳答案
POJO 是不遵循 Java Bean spoec 的对象。 IE。它没有 setter/getter。
JavaBeans 不需要有 setter,如果你不想调用它们,就不要生成它们。 (您的构建器可以调用包本地或私有(private)构造函数来创建您的不可变对象(immutable对象))
关于Java Builder 生成器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4257028/
我正在开发一个应用程序,我成功地消除了除一个错误之外的所有错误: no suitable constructor found for builder 更改为“意图” https://file.io/O
我可以在 C++Builder 6 中成功编译以下代码片段,但我无法在 RAD Studio Seattle 中编译它: unsigned long x = 50; String s = In
我有一个项目(新开始),其中 C++ Builder 没有在任何断点处停止。我已确保我处于 Debug模式(未发布),链接器->完整调试信息 = True,C++ 编译器->调试配置,C++ 编译器-
我们想在正在开发的 C++ builder XE 应用程序中绘制大型控制流程图。 这些图表将以编程方式生成并以交互方式显示给用户(用户可以滚动大流程图、选择节点等)。节点必须能够显示自定义组件(如 T
我有以下问题 午餐时 FlashBuilder.exe (BURRITO):它崩溃并创建一个错误日志文件,例如: hs_err_pid7084.log 及以下 但是当我咀嚼 FlashBuilderC
我有一个大型 Flash Builder 项目,它是更大 (.net) 解决方案的一部分。对于整个项目,我通常有一个前进的开发分支,以及一个或多个错误修复分支。考虑到 Flash Builder 不想
乘数(自动布局中约束的属性)有什么作用? 最佳答案 约束中两个值之间的关系由以下公式确定: b = am + c 其中 a 和 b 是要关联的两个值,m 是乘数,c code> 是常量。 例如,如果
我们的开发团队使用 Borland C++ Builder 6 和 CodeGear C++ Builder 2007(以及 Visual Studio)。我听到很多评论说 Builder 2007
我想阐明我对构建器模式的使用,特别是构建器类型是如何创建的。在示例中,它只是假定构建器的类型并创建它。但是,我在“ChartBuilderFactory”类中创建了一个 CreateBuilder 方
首先,我对 Java 比较陌生,所以我问的可能是微不足道的,但我在这里或其他地方找不到答案。 为简单起见,假设我有以下类层次结构: class Shape { protected Shape(
我试图在另一个 AlertDialog 中打开一个 AlertDialog,但它不起作用,知道为什么它不起作用吗? String items[] = {"Details","Edit","Delete
我有一个包含 Form1 和 Form2 的程序。如何单击按钮从 form1 打开 form2? 最佳答案 更多信息 在你的 Project.cpp 中有这个:Application->CreateF
每当我使用 C++ Builder(XE4 版,但以前的版本也这样做)在 Release模式下构建 Win32 EXE 时,它总是创建一个导出目录并为我的项目中的每个单元导出一个 Initialize
我正在尝试在我的试用版 flashbuilder 上启用设计模式,但找不到任何选项, 我已经查看了 Windows 菜单,但没有启用设计模式, 和首选项,但首选项对话框中没有 Flex 来启用其设计模
我目前正在将一个大型 RAD Studio 2010 项目迁移到 XE4。作为其中的一部分,我正在重新创建许多项目文件。我想借此机会确保我们对预编译头使用最好的机制,因为似乎有几种方法可以做到这一点。
我观看了“Interface Builder 中的新增功能” session 视频并尝试复制显示的代码,但不幸的是,当我将 View 分配给具有 @IBDesignable 的自定义类时,出现 2 个
这个问题在这里已经有了答案: Why is NotificationCompat needed? (3 个答案) 关闭 5 年前。 我看到的几乎所有 Android 通知示例代码似乎都使用了 Not
我正在使用 fcm 从我的 Android 应用程序发送通知,并且我已经实现了它要求我提供的所有库。 val topic = "highScores" // See docum
我正在尝试在Flash Builder 4.6中进行项目范围内的查找和替换,但是对我而言,如何实现这一点并不明显。 我试过Edit-> Find/Replace然后全部替换,但它仅替换当前打开的文件中
帮助我在 XCode4 中取消 fubar 界面构建器。 我在 interface-builder 中创建了一个按钮,并在 View 的代码中为它定义了一个 IBAction 方法。它运行良好。然后我
我是一名优秀的程序员,十分优秀!