Tag: design patterns

如何向上转换Java 8可选对象?

是否有一种有效的方法在使用Optional对象时执行向上转换。 这是一个示例代码: class A{} class B extends A{} B func(){ //do something return new B(); } Optional func2(){ //do something return Optional.of(new B()); } main() { A a = func(); // Upcasting works fine B b = func(); // Upcasting works fine Optional b = func2(); // 1. Upcasting works fine Optional a = func2(); […]

想要在java中的复杂结构上建议(DAO和服务层链接/耦合)

介绍 我试图在Java中使用接口,抽象类和generics构建一个相当复杂的结构。 由于没有仿制药的经验,只有平均创建优质OOP设计的经验,这开始certificate是一个相当大的挑战。 我有一种感觉,我正在尝试做的事情实际上无法完成,但我可以接近它。 我会尽量简短地解释一下。 我只想告诉我,这个结构将代表我的DAO和服务层来访问数据库。 使这个问题更抽象只会让它变得更加困难。 我的DAO层完全没有问题。 有一个通用的DAO接口,每个实体都有一个DAO接口,它扩展了generics接口并填充了generics类型。 然后是每个DAO实现扩展的抽象类,后者又实现相应的接口。 很可能会混淆读取,所以这里是以产品DAO为例的图表: 现在,对于服务类,我有一个类似的结构。 无论如何,服务类中的大多数方法都映射到DAO方法。 如果您使用“服务”替换上图中的每个“DAO”,您将获得我的服务层的基础。 但根据我的以下想法,有一件事我想做: 实体的每个服务类至少将访问一个DAO对象,即它所针对的实体的DAO。 哪个是…… 问题/问题 如果我可以进行适当的OO设计, 使每个服务类都有一个实例变量用于各自实体的DAO对象,我认为服务层将是完美的。 对我的建议是受欢迎的,以防我的设计看起来不那么好。 我已经像这样实现了它: 类AbstractService public abstract class AbstractService { EntityDAO entityDAO; public AbstractService() { entityDAO = makeEntityDAO(); //compiler/IDE warning: overridable method call in constructor } abstract EntityDAO makeEntityDAO(); } 类ProductServiceImpl public class ProductServiceImpl extends AbstractService { […]

为什么Scanner会实现Iterator ?

我只是想知道为什么java.util.Scanner实现java.util.Iterator ? Scanner实现remove方法并抛出UnsupportedOperationException 。 但是,在实现接口时,不应该是一个类,履行接口的契约? 实现iterator和添加抛出exception的方法有什么用? 为什么不避免接口的实现并保持简单? 可以认为它被定义为可以扩展Scanner的类可以实现该方法,例如AbstractList有一个抛出UnsupportedOperationException的add方法。 但是AbstractList是一个abstract类,而Scanner是一个final类。 这不是一个糟糕的设计实践吗?

建筑师设计模式的缺点

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

应用命令模式的真实世界示例

命令模式可用于实现Transactional behavior (和Undo )。 但是我用谷歌搜索找不到这些例子。 我只能找到switched on或off灯泡的一些简单例子。 在哪里可以找到使用Command Pattern实现的/这些行为的编码示例(最好是Java )?

如何通过CDI实现命令模式?

我是CDI的新手,有点困惑。 我有以下问题。 我们有课程动作。 我们有包装类,它将所有Action对象保存在hashmap中。 像这样的东西。 class TestAction implements Action{ @EJB private MyBean bean; public void doSomething(){ //here we do something with injected EJB } } class Foo { private HashMap hm; public void execute (String action){ this.hm.get(action).doSomething(); } } 当我不使用CDI时 – 一切都很好。 但我需要使用它。 因此,据我所知,我必须通过cdi容器创建所有操作,否则CDI容器无法将托管bean注入其中。 所以我的问题是什么是通过CDI实现命令模式的最佳方式? 编辑:我读过Dhanji R. Prasanna的dependency injection,Weld-reference(WR),JavaEE7教程(CDI部分) – 不建议阅读最后一篇。 在思考了一点之后,我明白我需要注入HashMap。 此外,我明白我必须使用生产者方法。 好。 我说。 […]

DAO架构的必要性是什么?

用Java编程时,总是需要根据DAO架构进行编码吗? 如果是这样,使用它有什么好处? 我正在做一个有下面类图的项目。 这有什么缺点? 实体类: private void fillSONumber() { try { ZnAlSalesOrder o = new ZnAlSalesOrder(); ArrayList a = o.getPendingSalesOrderIDs(); for (int i = 0; i < a.size(); i++) { cmbSoNo.addItem(a.get(i)); } o.close(); } catch (Terminated ex) { } } EntityTable类示例: public ResultSet select(String fields, String selection) { db = new Database(); db.select(“SELECT ” + […]

使用真值表过滤

想象一个带有布尔标志的Person类,该布尔标志指示该人是否可以使用 – 默认情况下设置为false。 public class Person{ boolean employable = false; … } 现在假设有一些外部布尔方法作用于Person对象。 例如,考虑实用程序类中的静态布尔方法。 public class PersonUtil{ public static boolean ofWorkingAge(Person p){ if(p.getAge() > 16) return true; return false; } … } 布尔静态方法本质上类似于布尔值函数,即谓词 。 我们可以用谓词构造一个2 ^(#谓词)-by-#谓词真值表。 例如,给定三个谓词: ofWorkingAge , ofGoodCharacter , isQualified我们可以构造以下8乘3真值表: TTT TTF TFT TFF FTT FTF FFT FFF 我们现在想雇用具有理想品质的人。 让+表示我们希望考虑某人可就业(即将他们的就业能力标志设为真 )和–相反。 TTT | […]

调整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 = […]

我们是否需要优先选择构造函数而不是静态工厂方法? 如果是的话,何时?

我一直在阅读Joshua Bloch撰写的 Effective Java ,到目前为止,它确实辜负了它的声誉。 第一个项目为构造函数的 静态工厂方法提供了令人信服的理由。 这么多,我开始质疑好老建设者的有效性:)。 本书的优点/缺点总结如下: 优点: 他们有名字! 我们有全面的实例控制(单身人士,表现等) 他们可以返回子类型/接口 编译器可以提供类型推断 缺点: 私有类不能被子类化 它们不像构造函数那样在文档中脱颖而出 第一个缺点实际上可能是A Good Thing (正如书中所提到的)。 第二个,我认为只是一个小缺点,可以通过即将发布的java版本轻松解决(javadoc的注释等) 看起来,最终工厂方法几乎具有构造函数的所有优点,许多优点,并没有真正的缺点! 所以,我的问题基本上分为三个部分: 默认情况下总是在构造函数上使用静态工厂方法是一种好习惯吗? 使用构造函数是否合理? 为什么面向对象的语言不能为工厂提供语言级支持? 注意:有两个类似的问题: 何时使用构造函数以及何时使用getInstance()方法(静态工厂方法)? 和对象的创建:构造函数或静态工厂方法 。 然而,答案要么只是提供上面的列表,要么重申我已经知道的静态工厂方法背后的基本原理。