- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要创建一组通过多级层次结构继承的构建器类,其中构建器需要驻留在要构建的类之外以及不同的包中。
从此示例中走出:https://onelostlogician.wordpress.com/2016/10/10/inheritance-generics-and-builders/下面的代码是通过根据要求进行更改而创建的:1. 将构建器移动到顶层,2. 将构建器和待构建放在不同的包中,并向后者添加 setter ,3. 将静态 newXYZ() 方法移动到构建器并删除其类型参数以消除删除冲突。这将是所需产品的合适模型。
package other;
public abstract class BaseClass {
protected Integer field1;
BaseClass () {
}
public Integer getField1 () {
return field1;
}
public void setField1 (Integer field1) {
this.field1 = field1;
}
}
package my;
import other.BaseClass;
public abstract class BaseClassBuilder<T extends BaseClass, BU extends BaseClassBuilder> {
protected T obj;
protected BaseClassBuilder (T obj) {
this.obj = obj;
}
protected final BU getThis () {
return (BU) this;
}
public BU withField1 (Integer field1) {
obj.setField1(field1);
return getThis();
}
public T build () {
return this.obj;
}
}
package other;
import java.util.UUID;
public class SubClass extends BaseClass {
protected UUID field2 = null;
public SubClass () {
}
public UUID getField2 () {
return field2;
}
public void setField2 (UUID field2) {
this.field2 = field2;
}
}
package my;
import java.util.UUID;
import other.SubClass;
public class SubClassBuilder<T extends SubClass, BU extends SubClassBuilder> extends BaseClassBuilder<T, BU> {
protected SubClassBuilder (T obj) {
super(obj);
}
public BU withField2 (UUID field2) {
obj.setField2(field2);
return getThis();
}
public T build () {
return this.obj;
}
public static SubClassBuilder neu () {
return new SubClassBuilder<>(new SubClass());
}
}
package other;
public class SubSubClass extends SubClass {
protected String field3 = null;
public SubSubClass () {
}
public String getField3 () {
return field3;
}
public void setField3 (String field3) {
this.field3 = field3;
}
}
package my;
import other.SubSubClass;
public class SubSubClassBuilder<T extends SubSubClass, BU extends SubSubClassBuilder<T, BU>> extends SubClassBuilder<T, BU> {
protected SubSubClassBuilder (T obj) {
super(obj);
}
public BU withField3 (String field3) {
obj.setField3(field3);
return getThis();
}
public T build () {
return this.obj;
}
public static SubSubClassBuilder neu () {
return new SubSubClassBuilder<>(new SubSubClass());
}
}
结果:SubSubClassBuilder.neu().withField1(..) 返回一个 BaseClassBuilder,withField2(..) 返回一个 SubClassBuilder,如 Android Studio 3.0.1 中的代码完成所示。在每个构建器中重写 getThis() 也不起作用。
回到第一点,我错过了什么?
编辑:遵循 Java: builder pattern, inheritance and generics 的提示它也尝试过像这样的静态(内部)构建器类,但效果相同:
package my;
import java.util.UUID;
import other.BaseClass;
import other.SubClass;
import other.SubSubClass;
public class Builders {
private Builders () {}
abstract static class BaseClassBuilder<T extends BaseClass, BU extends BaseClassBuilder> {
protected T obj;
protected BaseClassBuilder (T obj) {
this.obj = obj;
}
protected final BU getThis () {
return (BU) this;
}
public BU withField1 (Integer field1) {
obj.setField1(field1);
return getThis();
}
public T build () {
return this.obj;
}
}
public static class SubClassBuilder<T extends SubClass, BU extends SubClassBuilder> extends BaseClassBuilder<T, BU> {
protected SubClassBuilder (T obj) {
super(obj);
}
public BU withField2 (UUID field2) {
obj.setField2(field2);
return getThis();
}
public T build () {
return this.obj;
}
public static SubClassBuilder neu () {
return new SubClassBuilder<>(new SubClass());
}
}
public static class SubSubClassBuilder<T extends SubSubClass, BU extends SubSubClassBuilder<T, BU>> extends SubClassBuilder<T, BU> {
protected SubSubClassBuilder (T obj) {
super(obj);
}
public BU withField3 (String field3) {
obj.setField3(field3);
return getThis();
}
public T build () {
return this.obj;
}
public static SubSubClassBuilder neu () {
return new SubSubClassBuilder<>(new SubSubClass());
}
}
}
最佳答案
好消息:这是可以做到的。使您的方法变得不可能的是您希望中间构建器子类既具体化它们自己的自身类型,又通过子类化保持其开放以进行扩展。事实证明这是不可能的。
为了使其工作,您必须在每个级别都有一个抽象子类,它添加必要的方法并允许进一步扩展子类型,以及一个将自身指定为特定构建器的具体子类。
这是我改编的实现:
首先,从基类开始。我所做的更改主要是在构造函数中传递 self 类型的类。
portected abstract class BaseClassBuilder<T extends BaseClass, BU extends BaseClassBuilder<T, BU>> {
protected T obj;
private BU self;
protected BaseClassBuilder (T obj, Class<?> selfType) {
this.obj = obj;
this.self = (BU) selfType.cast(this);
}
final BU getThis () {
return self;
}
public BU withField1 (Integer field1) {
obj.setField1(field1);
return getThis();
}
public T build () {
return this.obj;
}
}
现在介绍 SubClassBuilder
的抽象版本。这个添加了我们构建 SubClass
实例所需的所有方法,但仍然是抽象的,因此它仍然可以用于扩展。
public abstract class AbstractSubClassBuilder<T extends SubClass, BU extends AbstractSubClassBuilder<T, BU>> extends BaseClassBuilder<T, BU> {
protected AbstractSubClassBuilder(T obj, Class<?> selfType) {
super(obj, selfType);
}
public BU withField2 (UUID field2) {
obj.setField2(field2);
return getThis();
}
}
这使我们能够非常轻松地为 SubClass
实例创建一个具体的构建器类:
public final class SubClassBuilder extends AbstractSubClassBuilder<SubClass, SubClassBuilder> {
private SubClassBuilder(SubClass obj) {
super(obj, SubClassBuilder.class);
}
public static SubClassBuilder neu () {
return new SubClassBuilder(new SubClass());
}
}
下一个级别的工作原理是一样的;一个抽象类来添加额外的构建器方法,并允许进一步扩展,它扩展了 AbstractSubClassBuilder
:
public class AbstractSubSubClassBuilder<T extends SubSubClass, BU extends AbstractSubSubClassBuilder<T, BU>> extends AbstractSubClassBuilder<T, BU> {
protected AbstractSubSubClassBuilder (T obj, Class<BU> selfType) {
super(obj, selfType);
}
public BU withField3 (String field3) {
obj.setField3(field3);
return getThis();
}
}
使其具体化,需要另一个类,但现在静态工厂方法不会隐藏其父类中的一个(neu
:你是德国人吗?)
public class SubSubClassBuilder extends AbstractSubSubClassBuilder<SubSubClass, SubSubClassBuilder> {
private SubSubClassBuilder(SubSubClass obj) {
super(obj, SubSubClassBuilder.class);
}
public static SubSubClassBuilder neu () {
return new SubSubClassBuilder(new SubSubClass());
}
}
现在构建任一类的实例都非常简单。
SubSubClass subSubClass = SubSubClassBuilder.neu()
.withField2(UUID.randomUUID())
.withField1(5)
.withField3("3")
.build();
SubClass subClass = SubClassBuilder.neu()
.withField1(66)
.withField2(UUID.randomUUID())
.build();
(归功于 AssertJ 我首先看到了这一点)
关于Java:构建器、继承、泛型 Redux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49488239/
我一直在尝试将 redux sagas 和 redux 工具包引入我的项目。我目前遇到的问题是 watcher saga 没有捕捉到 takeEvery 中的调度 Action 。效果并运行处理程序。
我需要使用 deep-freeze 库来深度卡住 react redux 应用程序中的整个 redux 状态,以检查状态是否有任何变化。我应该如何使用 deep-freeze 和 React redu
这是一个关于 Redux js 中状态的问题。我在该州有一个数组列表: { list: list } 根据 Redux 文档,我不应该修改 reducer 中的状态。我想在列表中添加一个新项目。我
我正在构建一个应用程序,在用户向下滚动时执行操作。如果我可以在用户再次向上滚动时撤消这些操作,基本上将滚动变成浏览操作时间线的一种方式,那就太好了。 Redux 中是否有内置的方法来做到这一点?或者我
从我从 Dan Abramov 的蛋头视频“javascript-redux-colocating-selectors-with-reducers”和他的一些推文中了解到,使用选择器将状态映射到 Pr
尝试使用 redux saga 运行 reduxdevtools: 收到此错误: Error Before running a Saga, you must mount the Saga middle
Redux 工具包文档提到在多个 reducer 中使用操作(或者更确切地说是操作类型) First, Redux action types are not meant to be exclusive
Redux 将调度状态更改的操作。 redux 中 Action 类型的命名约定是什么? 最佳答案 社区中有一些约定,我将在这里列出我知道并认为有用的约定: 最常见的约定是 将 Action 类型(“
使用 Redux Toolkit 可以吗,即使我只在其中创建 Slice 并通过 Redux Saga 解决中间件问题? 或者在这种情况下,最佳实践是使用 Redux Saga + raw Redux
Redux 如何处理深度嵌套的叶子模型变更?意思是,我正在从叶子一直发送到它的 reducer 句柄的更改事件,并且我不想将更改事件广播到整个树。 最佳答案 在 Redux 中,所有操作总是被分派(d
redux 使用什么类型的数据结构来使数据在 Angular 和 React.js 中持久化?我假设它使用持久数据结构。 最佳答案 Redux 是一种用于管理状态的架构。它不使用任何数据结构。它保留您
我们正在计划一个 Electron 应用程序,并且我们正在考虑 Redux。该应用程序将具有巨大 状态,可能会从数十个或数百个文件中读取数据。在做一些了解 Redux 的研究时,我发现 reducer
我不想添加属性 sections: []到我的对象 formOpen在 reducer 中,我收到我的对象 formOpen从我的服务器和其他属性,我想添加这个,我该怎么做? 谢谢 import {
我使用 redux-saga 的主要原因之一是它进行异步函数调用的可测试性。我的困境是,当我使用不属于我的 redux 存储的有状态对象进行编程时,使用 sagas 进行编程变得非常尴尬。是否有使用非
我是 redux 的新手,所以我有几个问题希望得到解答。如果您能解释一些有关构建 redux 架构的内容,那就太好了。 此时我使用 Flutter_Redux 包 ( https://pub.dart
我正在使用 React + Flux。我们的团队正计划从 flux 转向 redux。来自 Flux 世界的我对 Redux 感到非常困惑。在 flux 控制流中很简单,从组件 -> 操作 -> 存储
这个问题与过去不同,这就是为什么。这个问题是什么时候。由于两者本身都是很好的框架,所以问题是我什么时候应该使用 thunk 而不是 saga。因为我的一位 friend 一直坚持让我在我们的应用程序中
我搜索了高低,但找不到明确的答案。 我已经设法绕开 Redux 的机制,但是当我谈到 API 调用和异步操作创建者时,我被 Promises 上下文中的中间件所困。 你能帮我把乱七八糟的东西弄好吗?
我正在使用 redux-saga 但遇到了一个问题:redux-auth-wrapper 需要 redux-thunk进行重定向,所以我只是在我的商店中添加了 thunk: import {creat
问题(tl;博士) 我们如何创建 custom redux-orm reducer与 redux-toolkit的createSlice ? 有没有比这个问题中提供的尝试更简单、推荐、更优雅或只是其他
我是一名优秀的程序员,十分优秀!