Tag: 设计

Java体系结构 – 关于ActionListener约定的问题

我正在创建一个用户界面,显示图形和操作图形。 该类扩展JFrame实现了ActionListener。 然后,ActionListener根据操作调用不同的类来操作图形。 这种方法虽然在类中有很少的ActionListeners; 然而,现在这个课程变得难以管理。 我知道,为了封装,最好在用户界面类中使用ActionListener,因为它需要访问接口的非静态组件。 但是,封装和可读性之间似乎存在冲突。 我提议的是将类拆分为接口的一个类,将ActionListener的第二个类打破,并静态访问接口组件。 我想知道的是,这是遵循基本的设计惯例吗? 并且,如果这是一种可接受的方法,您会将主类放在用户界面类或ActionListener类中吗?

用Java扩展Throwable

Java允许您创建一个全新的Throwable子类型,例如: public class FlyingPig extends Throwable { … } 现在, 很少 ,我可能会这样做: throw new FlyingPig(“Oink!”); 当然还有其他地方: try { … } catch (FlyingPig porky) { … } 我的问题是: 这是一个坏主意吗? 如果是这样,为什么? 如果这是一个坏主意,可以做些什么来阻止这种子类型? 由于它不可预防(据我所知),可能导致什么灾难? 如果这不是一个坏主意,为什么不呢? 如果你可以extends Throwable ,你怎么能做出有用的东西呢? 拟议方案#1 我真的想做这样的事情的场景具有以下属性: “事件”最终会发生。 这是预料之中的 。 它绝对不是一个Error ,并且没有什么Exception它何时发生。 因为它是预期的 ,所以会有一个等待它的catch 。 它不会“滑倒”过去。 它不会“逃避”任何catch一般Exception和/或Error尝试。 “事件” 极少发生。 当它发生时,通常会有一个深层堆栈跟踪。 所以也许我现在很清楚我想说的是: FlyingPig是一个详尽的递归搜索的结果 。 要搜索的对象存在:只有在大海中找到它才是搜索空间。 搜索过程很长,因此相对昂贵的exception处理成本可以忽略不计。 […]

OO设计建议 – toString

所以我得到了Address类: class Address { private String streetAddress; private int number; private String postalCode; private City city; private State state; private Country country; } 我想让它的可读版本显示在网格列中。 什么是实现这一目标的最佳和最简洁的方法? 类Address内的toString方法( 我个人不喜欢这种方法,因为’toString’与地址没有直接关系 ) class ReadableAddressFormatter ReadableAddressFormatter ( Address addressToFormat ) public String getFormatted() 以前的类,但getFormmated将是静态的,接收Address实例并返回字符串 其他? 建议请。 我正在寻找一个好的设计,专注于清洁代码 , 解耦和可维护性 。

正确使用同步单身?

因此,我正在考虑建立一个业余爱好项目,一种类似的东西,只是为了了解我的编程/设计。 它基本上是一个multithreading的Web蜘蛛,更新相同的数据结构对象 – > int。 因此,为此使用数据库绝对有点过分了,我唯一能想到的是用于包含我的数据结构的线程安全单例。 http://web.archive.org/web/20121106190537/http://www.ibm.com/developerworks/java/library/j-dcl/index.html 我应该考虑采用不同的方法吗?

开放封闭原则和Java“最终”修饰符

开放封闭原则指出“软件实体(类,模块,function等)应该是可以扩展的,但是对于修改是封闭的”。 然而,Joshua Bloch在其着名的书“Effective Java”中给出了以下建议:“inheritance的设计和文档,或者禁止它”,并鼓励程序员使用“final”修饰符来禁止子类化。 我认为这两个原则显然是相互矛盾的(我错了吗?)。 在编写代码时,您遵循哪个原则,为什么? 你是否打开你的课程,不允许inheritance你的课程(哪些?),或尽可能使用最终修饰语?

在Java中,有人使用short或byte吗?

除了在流媒体中使用(byte [])之外,我并没有真正看到字节和短片的使用。 另一方面,我看到长期使用的实际值是| 100 | 和byte更合适。 这是现在相对便宜的内存性质的结果还是开发人员不必担心的这个细节?

RequestFactory理论:为什么经常调用Locator 。find()?

我是RequestFactory的新手,但在Thomas Broyer的慷慨帮助下,在审阅了下面的文档后,它变得更好:) RequestFactory入门 要求工厂搬运零件 GWT 2.4中的RequestFactory更改 但是你能解释一下为什么经常会不必要地(在我看来)不必要地调用Locator.find()吗? 在我的示例项目中,我有两个维护父子关系的实体Organization和Person。 当我获取组织Objectify时自动获取子Person。 我还在我的服务层saveOrganization和saveOrganization中创建了两个加载和持久化对象的方法。 现在考虑两种情况: 当我在客户端调用findOrganizationById ,在服务器端进行调用: OrderDao.findOrganizationById(1) PojoLocator.getId(Key(Organization(1))) PojoLocator.getId(Key(Organization(1)/Person(2))) PojoLocator.getId(Key(Organization(1))) PojoLocator.find(Key(Organization(1))) PojoLocator.getId(Key(Organization(1)/Person(2))) PojoLocator.find(Key(Organization(1)/Person(2))) 通过调用OrderDao.findOrganizationById我已经收到完整的对象图。 除了那之外,为什么要.find两次.find ? 数据存储的额外负载花了我钱。 当然我会缓存它,但修复它会很好。 我怎样才能避免这些额外的电话? 当我通过在客户端中调用saveOrganization来保存对象时,会发生类似的事情。 以下调用发生在服务器端: PojoLocator.find(Key(Organization(1))) PojoLocator.find(Key(Organization(1)/Person(2))) OrderDao.saveOrganization(1) PojoLocator.getId(Key(Organization(1))) PojoLocator.find(Key(Organization(1))) PojoLocator.getId(Key(Organization(1)/Person(2))) PojoLocator.find(Key(Organization(1)/Person(2))) 我可以理解在更新它之前需要从DataStore中获取两个对象。 RequestFactory将增量发送到服务器,因此在持久化之前需要拥有整个对象。 自从我一次加载完整的图形以后,最好不要进行第二次调用,这是PojoLocator.find(Key(Organization(1)/Person(2))) 。 在持久化之后 ,我真的无法理解对.find()调用的需求。 想法? 我的代理人 @ProxyFor(value = Organization.class, locator = PojoLocator.class) public interface OrganizationProxy extends EntityProxy { […]

什么时候可以使用instanceof?

我正在设计一款游戏。 在游戏中,各种游戏对象根据他们需要做的事情扩展不同的接口(和一个抽象类),并传递给处理程序,这些处理程序按照定义的时间间隔处理具有特定接口的项目(它们实际上将所有工作分散开来以一种简洁的方式确保始终处理输入/video/等)。 无论如何,其中一些对象扩展了抽象类Collider并传递给CollisionHandler。 Collider类和处理程序负责碰撞中涉及的所有技术,并且只要求对象实现collidesWith(Collider c)函数,并根据它碰撞的内容进行修改。 许多不同类的对象将彼此碰撞,并且将根据它们碰撞的对象的类型及其特定属性而以非常不同的方式起作用。 完美的解决方案似乎是像这样使用instanceof: class SomeNPC extends Collider{ collidesWith(Collider c){ if(c instanceof enemy){ Fight it or run away depending on your attributes and theirs. } else if(c instanceof food){ Eat it, but only if it’s yellow. } else if(c instanceof BeamOfLight){ Try to move towards its source. } } } 这实际上似乎是一个合法的地方。 我感觉很糟糕。 […]

为什么#clone()不在Cloneable接口中?

我正在阅读正确执行数组的深层副本,但是我对#clone()的实现方式感到困惑。 它是java.lang.Object类的成员,但是如果你读了javadocs: 首先,如果此对象的类未实现Cloneable接口,则抛出CloneNotSupportedException。 那么为什么要首先在那里定义clone方法呢? 当然,如果方法只能在存在接口时使用,则将该方法放在接口中。 Cloneable接口本身是空的; 它只是Java使用的标记接口,以确保使用clone方法是合法的。 这样做也会消除使用generics来确保类型安全的能力: class Foo implements Cloneable { // Valid. @Override public Object clone() throws CloneNotSupportedException { // … } } class TypeSafeFoo implements Cloneable { // Not valid. @Override public TypeSafeFoo clone() throws CloneNotSupportedException { // … } } Java为什么这样做? 我确信他们有合理的理由,但我似乎无法弄明白。

如果我们有多个XML配置文件,DispatcherServlet如何工作?

问题 如果我们有多个XML配置文件,DispatcherServlet如何工作,那么Spring Application Context如何加载它们并对它们起作用? 场景: 在我的情况下,我们有一个应用程序应该是全局的应用程序应该有AP{Asia-Pacific}, EM{Europ-Middleeast}, CA{Canada} and LA{Latin America}版本。 目前,我们有一个应用于EM一个区域,它有XML Configuration File ie, em-servelt.xml ,然后现在有针对AP region通用web.xml文件,我们有另一个ap-servlet.xml文件,并且em-servlet.xml和ap-servlet.xml file方式都有相同的bean名称,但是它们会指向不同包中的Controllers,所以例如,em会指向类似com.em.DomainController和ap的东西。指向com.ap.DomainController 。 所以我的问题是 请求如何映射到不同的控制器以及如何识别请求以便它应该从ap-servlet.xml或em-servlet.xml读取? 我希望能够清楚地陈述我的问题。