Tag: 设计模式

Hibernate:检查修改了哪个实体的字段

是)我有的: 我有Hibernate实体,它包含许多非瞬态字段,包​​括集合。 用户可以单独更新每个字段或一次更新某些字段。 真是个挑战: 在处理程序中,我应该检查实体的哪个字段已被更改: public void handle(Entity newVersion) { Session session = sessionFactory.openSession(); Entity oldVersion = (Entity) session.get(Entity.class, entity.getId()); List changedFields = compareChanges(oldVersion, newVersion); //HOW TO CHECK WHICH FIELDS ARE CHANGED? } 我想出于安全和通知的原因这样做。 手段: 并非所有用户都可以修改所有字段 我应该在某些字段更改时以特定方式通知特定用户。 真是个问题: 我得到了非常难看的代码。 实际上我遍历所有字段/集合并调用equals方法。 题: 可能是Hibernate提供更优雅的方式来检查哪些字段已被修改? 怎么样? PS @victorantunes提供了一个解决方案,但对我来说似乎太全面了。 可能是一些替代品?

业务逻辑validation模式和建议

我的应用程序中有两层validation。 首先是由beanvalidationAPI执行的实体validation(例如必填字段)。 第二级是业务逻辑validation。 例如,用户有一个post。 用户可以删除post,只有他是这篇文章的创建者并且评分<50。所以我必须做这样的事情: if (post.getCreator().equals(session.getUser())) { if (post.getRating() < 50) { postRepository.delete(post); } else errors.add(400, "Cant delete post with rating 50 or higher") } else errors add (400, "You should be owner of the post") 我不喜欢这种方式,因为这个条件被重用,我必须重复代码。 此外,如果条件数大于5,则读取和理解代码变得不真实。 此外,标准的Spring Validator将不会非常有用,因为我必须为不同的操作(例如删除和更新)为一个实体制作不同的validation 所以我正在寻找一种更聪明的方式(模式可能),如果有人能给我一个提示,我将非常感激。 预先感谢!

什么是修订后的构建模式?

GoF的原始Builder模式与Joshua Bloch的“修订的GoF Builder模式”有什么区别?

延迟加载的单例:双重检查锁定与按需持有者惯用语初始化

我需要在并发环境中延迟加载资源。 加载资源的代码只能执行一次。 双重检查锁定 (使用JRE 5+和volatile关键字)和初始化按需持有者习惯似乎很适合这项工作。 仅仅通过查看代码,按需初始化持有者习惯看起来更干净,更有效(但是,嘿,我在这里猜测)。 不过,我必须小心并记录我的每一个单身人士的模式。 至少对我而言,很难理解为什么代码是这样编写的…… 我的问题是:哪种方法更好? 为什么? 如果你的答案是否定的。 您将如何在Java SE环境中解决此要求? 备择方案 我可以使用CDI而不强加它在整个项目中的使用吗? 那里有文章吗?

使用inheritance和多态来解决常见的游戏问题

我有两节课; 让我们称他们为食人魔和巫师。 (所有字段都是公开的,以便更容易输入示例。) public class Ogre { int weight; int height; int axeLength; } public class Wizard { int age; int IQ; int height; } 在每个类中,我都可以创建一个名为battle()的方法,该方法将确定如果Ogre遇到Ogre或者向导遇到向导,谁将获胜。 这是一个例子。 如果食人魔遇到食人魔,那么较重的食人魔会获胜。 但是如果重量是相同的,那么具有更长轴的那个获胜。 public Ogre battle(Ogre o) { if (this.height > o.height) return this; else if (this.height o.axeLength) return this; else if (this.axeLength < o.axeLength) return o; else return […]

(实体 – 控制 – 边界模式) – >如何处理两个实体?

前提 我最近阅读/观看了由Java Champion Adam Bien撰写的很多文章/video,他主张使用古老但更新的 实体 – 控制 – 边界设计模式 JAVA EE> = 6。 利用CDI,EJB 3.1,JPA 2和其他JAVA EE 6function,这种模式应该有助于创建更多面向业务的组件 ,更容易进行unit testing,并根据职责更高地分离关注点。 由于我使用了上面列出的所有function,这种模式听起来非常有趣,我正在寻找它,看看ECB是否符合我的下一个项目要求。 到目前为止我得到了什么 在ECB中,每个逻辑实体分为三部分(如果我错了,请纠正我): 边界 ,一种强大的外墙,唯一可从外面进入的等级。 对于外部 (如果我做对了),我们的意思是在应用程序之外 ,例如。 远程客户端, 在组件包之外 ,例如。 我申请的另一部分; a(n可选) 控制器 ,负责某种操作(例如,实体的validation); 一个实体 ,可以是一个纯粹的JPA实体,但也可以包含一些装饰/validation/(最小)业务逻辑。 例如,考虑有两个不同的实体( Orange和Apple ),一个在它们FruitsManager做CRUD的类( FruitsManager )和一个对它们执行一些控制的类( FruitsQualityChecker )。 直到昨天,它会像( OLD WAY ): com.foo.bar.business.FruitsService /* CRUD */ com.foo.bar.business.FruitsQualityChecker /* […]

构造函数参数 – 经验法则

通常,类构造函数应该接受的参数的最大数量是多少? 我正在开发一个需要大量初始化数据的类(目前有10个参数)。 但是,具有10个参数的构造函数感觉不对。 这让我相信我应该为每个数据创建一个getter / setter。 不幸的是,getter / setter模式不会强制用户输入数据,如果没有它,对象的表征就不完整,因此无用。 思考?

如何以适当的方式编写单身人士?

今天在我的采访中,一位采访者让我写了一个Singleton课程。 我给出了答案 public class Singleton { private static Singleton ref; private Singleton() { } public static Singleton getInstance() { if (ref == null) { ref = new Singleton(); } return ref; } } 突然他告诉我这是写作课的老方法。 任何人都可以帮助我,为什么他这样说。

如何删除类方法中的try / catch重复?

我有RESTeasy服务。 并且已经使用try catch对方法实现了简单的error handling,并且感觉某些东西不是很好。 我注意到我尝试抓住所有方法的重复。 所以我想问一下如何避免重复(减少代码大小) try catch但不丢失function。 @Path(“/rest”) @Logged @Produces(“application/json”) public class CounterRestService { @POST @Path(“/create”) public CounterResponce create(@QueryParam(“name”) String name) { try { CounterService.getInstance().put(name); return new CounterResponce(); } catch (Exception e){ return new CounterResponce(“error”, e.getMessage()); } } @POST @Path(“/insert”) public CounterResponce create(Counter counter) { try { CounterService.getInstance().put(counter); return new CounterResponce(); } catch (Exception […]

Bulider Design Pattern为具有大量参数的方法制作通用方法

我有一个接口Itest , ClassA和ClassB正在实现这个接口。 testA和testB分别是这些类中的方法。 testA(String a, String b, String c, D d, E e) testB(String a, String b, String c, F f, G g) 这里D , E , F , G是自定义数据类型(与数据库相关) 。 我简化了方法实际上他们有更多的参数。 我需要在Itest接口的testAB中创建一个generics方法,并在两个类中实现它而不是拥有自己的方法。 testAB(String a, String b, String c, D d, E e, F f, G g) 由于参数的数量越多,通用方法testAB对于用户testAB将是痛苦的,因为他必须传递如此多的null值。 这是Bulider Design Pattern的用例吗? 如果是,如何使用这种设计模式实现这一目标?