Tag: 设计

使用Java编写XML的最佳实践和设计指南?

有几次我遇到了需要生成XML(尺寸相对较小)的任务。 每次我徘徊: 在编码的简易性,代码的可读性和可维护性,性能和良好的设计实践方面,动态创建XML文档的最佳实践是什么? 例如: 是连接字符串,还是创建DOM树并填充它更好? 最好(’程序性地’)因此汇总构建XML的行或者有许多方法处理它们的文档部分? 通过工具(哪个?)或每次从头开始生成XML的主干更好? 如果你能分享一些参考资料,我会很感激,这个主题上是否有一个着名的主题?

java api设计 – NULL或Exception

返回null值或从API方法抛出exception是否更好? 返回null需要全部进行丑陋的空检查,如果未选中返回则会导致严重的质量问题。 抛出exception会强制用户对错误条件进行编码,但由于Javaexception冒泡并迫使调用者代码处理它们,因此通常使用自定义exception可能是一个坏主意(特别是在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。 此外,我明白我必须使用生产者方法。 好。 我说。 […]

MVC很多视图和一个控制器

在我的应用程序中有许多视图(子组件)和只有一个控制器。 在一个视图中选择一些选项可以更改另一个视图中的组件布局和数量。 控制器初始化视图,进而创建所有子组件。 在这样的应用程序中,控制器是否需要引用所有子组件? 如在一个视图中的侦听器中调用控制器来执行操作,然后需要更新另一个视图。 我觉得控制器不应该引用所有的视图,但不知道在哪里形成。 Head第一个设计模式书中的例子只有一个视图,所以我被卡住了。 ++++++++++++++++++++++++ 更多详情。 我正在写的游戏是一个跳棋(草稿)游戏。 在一种情况下,当计算机对抗自身时,用户必须在游戏开始之前选择一些选项。 一个这样的选择是在游戏期间的某些时段选择游戏策略。 例如当它在板上有12到8块时它会攻击更多,在板上8到4块它将更具防御性。 目前游戏GUI的结构方式是,有一个整体的JPanel(RightContainerFrame),其中包含其他JPanel; 然后有一个JPanel(StartGamePanel),用户可以在其中配置游戏。 还有一个包含选项卡的JTabbedPane(jTabbedPane1)。 当用户在JComboBox中选择某个选项时,当前在StartGamePanel中,需要在jTabbedPane1中添加或删除选项卡。 我目前实现这一目标的方法是在StartGamePanel中 RightContainerFrame.getInstance().generateAndDisplayPlayerTwoRangeTabs(numberOfRangeTabsNeeded); 现在我知道这是完全错误的,因为我有一个视图,StartGamePanel通过调用另一个容器视图RightContainerFrame中的方法直接更改另一个视图JTabbedPane。 我对如何构建这个问题的任何建议持开放态度。 首先,我可以将jComboBox1ActionPerformed方法移动到控制器。 这可以更新jTabbedPane1的模型。 或者它可以直接在jTabbedPane1中调用方法来显示所需的选项卡数量。

String,StringBuffer和StringBuilder之间的性能和简单性权衡

你有没有想过这种变化在Java编程语言中的含义? String类被设想为一个不可变类(并且这个决定是故意考虑的)。 但字符串连接真的很慢,我自己对它进行了基准测试。 所以StringBuffer诞生了。 非常好的课程,同步和非常快。 但有些人对某些同步块的性能成本不满意,并引入了StringBuilder。 但是,当使用String来连接不太多的对象时,类的不变性使其成为实现线程安全的一种非常自然的方式。 当我们想要管理多个字符串时,我可以理解StringBuffer的使用。 但是,这是我的第一个问题: 例如,如果你想要追加10个或更少的字符串,你会在执行时间内将简单性换成几毫秒吗? 我也对StringBuilder进行了基准测试。 它比StringBuffer更有效(仅提高10%)。 但是,如果在您的单线程程序中使用StringBuilder,如果您有时想要将设计更改为使用多个线程,会发生什么? 你必须改变StringBuilder的每个实例,如果你忘记了一个,你将会产生一些奇怪的效果(考虑到可能出现的竞争条件)。 在这种情况下,你会在几小时的调试中交易性能吗? 好的,就是这样。 除了简单的问题(StringBuffer比“+”和线程安全更有效,而StringBuilder比StringBuffer更快但没有线程安全)我想知道何时使用它们。 (重要:我知道它们之间的差异;这是一个与平台架构和一些设计决策相关的问题。)

如何从未经检查的exception中恢复?

如果您想以相同的方式处理每个故障,例如通过记录它并跳到下一个请求,向用户显示消息并处理下一个事件等,如果这是我的用例,那么所有我都可以使用未经检查的exception。要做的是在我的系统中捕获一些高级别的常规exception类型,并以相同的方式处理所有内容。 但我希望从特定问题中恢复,而且我不确定使用未经检查的exception来处理它的最佳方法。 这是一个具体的例子。 假设我有一个使用Struts2和Hibernate构建的Web应用程序。 如果exception冒泡到我的“动作”,我会记录它,并向用户显示一个非常道歉。 但我的Web应用程序的一个function是创建新的用户帐户,这需要一个唯一的用户名。 如果用户选择已存在的名称,Hibernate会在我的系统内容中抛出org.hibernate.exception.ConstraintViolationException (未经检查的exception)。 我真的想通过要求用户选择另一个用户名来恢复这个特定问题,而不是给他们相同的“我们记录了你的问题,但现在你已经被软化了”的消息。 以下是需要考虑的几点: 有很多人同时创建帐户。 我不想在“SELECT”之间锁定整个用户表以查看名称是否存在,如果不存在则锁定“INSERT”。 在关系数据库的情况下,可能有一些技巧可以解决这个问题,但我真正感兴趣的是一般情况下,由于基本的竞争条件,预先检查exception将不起作用。 同样的事情可能适用于在文件系统上查找文件等。 鉴于我的首席技术官倾向于通过读取“Inc.”中的技术专栏引起的偷渡管理,我需要在持久性机制周围留下一层间接,以便我可以抛弃Hibernate并使用Kodo或其他任何东西,而不会改变任何东西,除了最低持久性代码层。 事实上,我的系统中有几个这样的抽象层。 尽管有未经检查的例外,我怎样才能防止它们泄漏? 已检查exception的一个已声明的弱点是必须在堆栈的每个调用中“处理”它们 – 或者通过声明调用方法抛出它们,或者通过捕获它们并处理它们。 处理它们通常意味着将它们包装在另一个适合抽象级别的类型的检查exception中。 因此,例如,在checked-exception UserNotFoundException ,我的UserRegistry的基于文件系统的实现可能捕获IOException ,而数据库实现将捕获SQLException ,但两者都会抛出隐藏底层实现的UserNotFoundException 。 如何利用未经检查的exception,免除每层的包装负担,而不泄漏实现细节?

BigDecimal和Money

我研究过并发现,在处理货币时,最好的计算方法是使用BigDecimal类。 考虑到这一点,我正在制定一个代码,将各种类型的外币兑换成美元货币,反之亦然(具体而言,是一种取货币并将其兑换成美元货币的现金寄存器,计算变化并将此金额返还给外币客户)。 截至目前,许多方法使用double ,其中两个使用int作为用于计算美国货币的参数。 题: 由于我想在计算中使用BigDecimal类,我是否应该将所有涉及双精度计算的方法更改为BigDecimal?

如何用相同的方法“包装”两个类?

我必须使用相同的方法处理两个类,但它们不实现相同的接口,也不扩展相同的超类。 我不能/不允许更改这个类,我不构造这个类的实例我只得到这个对象。 避免大量代码重复的最佳方法是什么? 其中一个类: package faa; public class SomethingA { private String valueOne = null; private String valueTwo = null; public String getValueOne() { return valueOne; } public void setValueOne(String valueOne) { this.valueOne = valueOne; } public String getValueTwo() { return valueTwo; } public void setValueTwo(String valueTwo) { this.valueTwo = valueTwo; } } 和另外一个… package […]

在这种情况下使用适合的嵌套枚举?

我需要支持许多ChartTypes 。 这些图表类型中的每一种都可以支持许多ChartSubTypes 。 例如, AreaChart类型可以有PercentArea , StackedArea等。我正在考虑为SubTypes和SubTypes使用Enum,然后在某处维护一个类似于以下内容的地图: Map<ChartType,List mapTypes; 我可以在这里以某种方式使用嵌套的枚举模式吗? 如果是,那怎么样?

避免重复代码的好策略

假设我有以下情况: public class A { public String createString(final String value){ if (value == null){ throw new NullPointerException(“value must NOT be null.”); } final StringBuffer sb = new StringBuffer(); sb.append(“A”); sb.append(“B”); sb.append(“C”); if (value.length() > 3){ sb.append(“D”); sb.append(“E”); } sb.append(“Z”); return sb.toString(); } } 另一个类应该做类似的任务: public class B { public String createString(final String value){ if (value […]