Tag: 设计模式

Effective Java的防御性副本

我正在阅读约书亚布洛赫的“有效Java”,第39项制作防御性副本,我有一些问题。 我总是使用以下结构: MyObject.getSomeRef().setSomething(somevalue); 这是短的: SomeRef s = MyClass.getSomeRef(); s.setSomething(); MyObject.setSomeRef(s); 它总是有效,但我想如果我的getSomeRef()返回一个副本,那么我的快捷方式将无法工作,如果可以安全地使用快捷方式,我怎么知道MyObject的实现是否被隐藏?

Spring的运行时dependency injection

我目前的项目是利用Spring,我们的架构师决定让Spring管理服务,存储库和Factory对象,但不管理域对象。 我们正在密切关注域驱动设计。 不对域对象使用spring的原因主要是spring只允许静态dependency injection。 静态dependency injection的意思是在xml配置中指定依赖关系并且它们被“冻结”。 我可能错了,但我目前的理解是,即使我的域只利用接口与对象进行通信,但spring的xml配置迫使我指定具体的依赖。 因此,必须在部署时解决所有具体的依赖关系。 有时,这是不可行的。 我们的大多数用例都基于根据运行时数据或从最终用户接收的消息注入特定类型。 我们的大部分设计都遵循命令模式。 因此,当我们收到命令时,我们想构建我们的域模型,并根据从命令接收的数据,我们将特定的类型集注入到我们的聚合根对象中。 因此,由于缺乏spring基于运行时数据构建域模型的能力,我们不得不使用静态工厂方法,构建器和工厂模式。 有人可以建议spring是否有上述情况的问题? 我可以使用AOP注入依赖项,但后来我没有利用spring的基础架构。

多态对象层次结构的构建器模式:Java可能吗?

我有一个接口层次结构, Child实现Parent 。 我想使用不可变对象,所以我想设计构建这些对象的Builder类。 但是,我有许多Child接口,我不想重复在每种类型的子构建器中构建Parent的代码。 因此,假设以下定义: public interface Parent { public Long getParentProperty(); } public interface Child1 extends Parent { public Integer getChild1Property(); } public interface Child2 extends Parent { public String getChild2PropertyA(); public Object getChild2PropertyB(); } 如何有效地实现构建器Child1Builder和Child2Builder ? 他们应该支持以下操作: Child1 child1 = Child1Builder.newChild1().withChild1Property(5).withParentProperty(10L); 和 Child2 child2 = Child2Builder.newChild2().withChild2PropertyA(“Hello”).withParentProperty(10L).withChild2PropertyB(new Object()); 我不想为每个子构建器实现withParentProperty的特殊情况。 编辑为Child2添加第二个属性,以澄清这不能用简单的generics。 我不是在寻找一种方法来组合Child2和Child2 – 我正在寻找一种方法来实现一个不会复制为每个子类构建父类的工作的Builder系统。 […]

(Android)如何设置带有模式的动作栏

我需要以类似的方式设置我的Android操作栏样式( 例子 )。 我知道这是iOS版本,它不适合Android指南,但这是我的任务。 我也知道我不能改变状态栏的颜色,我的目标只是风格动作吧。 如果有任何提示,我将不胜感激。

Java:懒惰初始化单例

创建单身人士的模式似乎是这样的: public class Singleton { private static final Singleton instance = new Singleton(); private Singleton(){ } public static Singleton getInstance() { return instance; } } 但是我的问题是,如果Singleton构造函数执行不是unit testing友好的事情,例如调用外部服务,jndi查找等,你如何使用这样的类。 我想我可以重构它: public class Singleton { private static Singleton instance; private Singleton(){ } public synchronized static Singleton getInstance() { if(instance == null) instance = new Singleton(); return instance; } […]

装饰ObservableList并保留更改事件的最佳实践

我的数据源提供了一个ObservableList ,但是对于我的ListView,我需要一个ObservableList 。 Warning基本上只是字符串的装饰器,添加一个布尔值来提供跟踪我的ListView复选框状态的方法,如本答案中所提出的。 class Warning { private final ReadOnlyStringWrapper name; private final BooleanProperty checked; /* … */ } 目前,我正在观察原始列表中的更改事件,并手动添加/删除警告列表中的项目: ObservableList stringList = …; ObservableList warningList = …; stringList.addListener(new ListChangeListener() { @Override public void onChanged(ListChangeListener.Change change) { if (change.wasAdded()) { warningList.addAll(change.getAddedSubList().stream().map(Warning::new).collect(Collectors.toList())); } else if (change.wasRemoved()) { change.getRemoved().forEach(str -> { warningList.removeIf(w -> str.equals(w.name)); }); } } […]

正确实现按需初始化持有者习惯用法

我有两个版本的“初始化按需持有人习惯用语”: http://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom http://en.wikipedia.org/wiki/Singleton_pattern#The_solution_of_Bill_Pugh 上述主要区别在于,第一个宣布INSTANCE为私有 ,但第二个宣布INSTANCE为公开 。 请告诉我应该使用哪一个。 对不起,我没有发现在我的应用程序中使用private和public之间的区别: public class Singleton { private int x; public int getX() { return x; } private Singleton () {} private static class LazyHolder { //both private and public works private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return LazyHolder.INSTANCE; } } 我唯一要做的就是调用类似Singleton.getInsance().getX() […]

为什么在Singleton类中使用私有Constructor是强制性的

这是我用于获取数据库连接的单例类。 我在这里有一个问题:为什么必须在单例类中包含一个私有构造函数(在整个应用程序中我只调用一次这个类)并且可以使用静态方法实现类的一个实例? 这个私人构造函数可以避免,还是它是mantadatory? public class ConnPoolFactory { private static DataSource dataSource; private static Connection connection; private ConnPoolFactory() { System.out.println(” ConnPoolFactory cons is called “); } public static synchronized Connection getConnection() throws SQLException { try { if (connection == null) { Context initContext = new InitialContext(); Context envContext = (Context) initContext .lookup(“java:/comp/env”); dataSource = (DataSource) envContext.lookup(“jdbc/Naresh”); […]

如何在Java类中限制对象创建不超过3?

如何在Java类中限制对象创建不超过3? 你能告诉我怎么做吗?

Java bean的setter许可证是否会返回?

我可以定义setter方法来返回它而不是void吗? 喜欢: ClassA setItem1() { return this; } ClassA setItem2() { return this; } 然后我可以使用新的ClassA()。setItem1()。setItem2()