Tag: oop

绘图应用程序中撤消/重做的命令模式

我想在一个小的绘图应用程序中实现undo / redo。 似乎命令模式非常适合使用,但我不确定如何最好地实现它。 据我了解模式,有必要在每个命令中包含: 用于重做的绘制操作的详细信息(例如,线 – >开始和结束点,自由格式线 – > GeneralPath ) 更改撤消之前组件的状态。 在这种情况下,这将是受命令影响的区域的小快照图像。 我的理解是,每个命令都需要“primefaces”或自包含,并具有撤消/重做该操作所需的所有信息。 不幸的是,这需要存储比我最初预期更多的信息。 对于一行,我们还必须考虑最初用于绘制它的Color , Stroke和RenderingHints类的东西。 这将我的“简单的小命令”变成了一些东西……在内存中更笨重,并且有更多的样板代码可以生成(每个都是可序列化的bean 1 )。 出于记忆保护的原因(大多数情况下),我想要“欺骗”命令的规范。 也许每100次更新都会备份整个绘图区域,但是不存储已更改图像的任何部分,只需为每次新的绘制操作重建最后(最多)100个命令。 但是在绘制每个零件之前确保Graphics对象的状态是正确的似乎是有问题的 – 这部分可能需要一条线,但RenderingHints在4个命令之前被更改, Color在98命令之前被更改,而Stroke仍然是最后227个命令也一样。 追求更高效的内存命令似乎将模式从“primefaces”方面抛到了窗外。 这反过来导致难以确定可能影响渲染的最早命令。 我是不是该: 寻找新的模式? 尝试通过调整模式来实现我的特殊需求? 将所有这些丢弃在垃圾箱中作为过早优化,并以最简单(并且最耗费内存消耗)的方式对其进行编码,以便遵循定义的命令模式? 更新 “每个都是一个可序列化的豆子”在第二个想法,没有。 我做了圆顶检查,发现Graphics2D (整齐地封装了绘制时使用的许多参数)不可序列化。 此外, BasicStroke 是可序列化的,但不存储笔划的粗细。 我可以创建许多属性的可序列化版本,但它似乎会产生更多的代码,所以我将放弃该规范。 同样。 我将只尝试在运行时存储对BufferedImage的引用。

为什么方法中不允许使用静态本地类?

我一直在刷我的java,我对本地类(我最终从未使用过)有一些误解,我很清楚静态的概念,但不是本地类的情况。 1.为什么本地类不允许使用静态方法? 2.为什么方法中不允许使用静态本地类? 本地类中不允许使用静态方法: 在这里,我不明白。 对我来说,本地类与静态方法main相关联。 我只是不明白为什么不能这样做。 方法main通过Sequence类访问,然后因为sayGoodbye是静态的,所以应该通过它的类访问它。 但不是。 public class Sequence { public static void main(String… args) { class EnglishGoodbye { public static void sayGoodbye() { // this cannot be done System.out.println(“Bye bye”); } } EnglishGoodbye.sayGoodbye(); } } 方法中不允许使用静态本地类: 这是不可能做到的:它有点含糊不清但我认为这里的静态与非静态具有相同的含义,因为静态类与静态方法相关联。 我很困惑。 public class Sequence { public static void main(String… args) { static class EnglishGoodbye […]

如何在Java中实现抽象静态方法?

关于包含静态抽象Java方法的不可能性存在许多问题。 关于此的解决方法(设计缺陷/设计强度)也有很多。 但我找不到任何关于我即将陈述的具体问题。 在我看来,制作Java的人和很多使用它的人并没有像我和其他许多人那样思考静态方法 – 作为类函数或属于类的方法而不是任何对象。 那么还有其他一些实现类函数的方法吗? 这是我的例子:在数学中,一个组是一组对象,可以使用某些操作*以某种合理的方式相互组合 – 例如,正实数在正常乘法下形成一组( x * y = x × y ),并且整数集形成一个组,其中’乘法’运算是加法( m * n = m + n )。 在Java中对此进行建模的一种自然方法是为组定义接口(或抽象类): public interface GroupElement { /** /* Composes with a new group element. /* @param elementToComposeWith – the new group element to compose with. /* @return The composition of […]

我可以使用类的方法而不实例化这个类吗?

我有一个有几个方法的类,这些方法中没有构造函数。 所以,我想知道是否可以在没有创建类实例的情况下调用类的方法。 例如,我可以这样做: NameOfClass.doMethod(x1,x2,…,xn) 总的来说,我不明白为什么它应该是不可能的。 我只是调用一个函数来做某事(或返回一些值)。 如果可能,如果方法为类的私有变量设置值,将会发生什么。 我怎样才能达到这个值? 以同样的方式? NameOfClass.nameOfVariable

Java中的重载和隐藏方法

我有一个带有public insert()方法的抽象类BaseClass: public abstract class BaseClass { public void insert(Object object) { // Do something } } 这是由许多其他类扩展。 但是,对于其中一些类, insert()方法必须具有其他参数,以便它们不会覆盖它,而是使用所需的参数重载基类的方法,例如: public class SampleClass extends BaseClass { public void insert(Object object, Long param){ // Do Something } } 现在,如果我实例化SampleClass类,我有两个insert()方法: SampleClass sampleClass = new SampleClass(); sampleClass.insert(Object object); sampleClass.insert(Object object, Long param); 我想要做的是隐藏基类中定义的insert()方法,以便只显示重载: SampleClass sampleClass = new SampleClass(); […]

何时编写静态方法与实例方法的编码是否有经验法则?

我正在学习Java(和OOP),虽然它可能与我现在所处的位置无关,但我想知道是否可以分享一些常见的陷阱或良好的设计实践。

Java接口是抽象类吗?

我正在完成一些家庭作业,并在之前的试卷上提出一个问题,要求在给定的UML图中命名所有抽象类。 我想,相当简单。 有一个抽象类和三个接口。 一般来说,这些接口是否有资格作为抽象类?

在java中将对象声明为final

有人可以澄清下面代码的重要性。 class A { int i = 10; public void setI(int b) { i = b; } public int getI() { return i; } } class Test { public static void main(String args[]) throws Throwable { final A ob = new A(); ob.setI(10); System.out.println(ob.getI()); } } 对象A被声明为final,但我可以更改此对象的实例变量的值,并还可以检索更新的值。 那么将对象声明为final是什么意义。 我知道将原始数据类型声明为final,这使得该变量不变。

将子类传递给方法但是以超类作为参数?

我有一个抽象类Vehicle其中包含2个已实现的子类RedVehicle和YellowVehicle 。 在另一个类中,我有一个List包含两个子类的实例。 我希望能够传递一个类类型的方法,然后使用该类型来决定我想在List做哪些对象。 由于Class是通用的,我应该使用某些东西进行参数化,但是将参数作为父类使用Vehicle停止调用代码的工作,因为exampleMethod现在需要一种Vehicle类型,而不是RedVehicle或YellowVehicle的子类。 我觉得应该有一个干净的方法来实现这个function的正确方法是什么? nb我不一定要传递Class类型,如果有更好的建议我会很乐意尝试这些。 调用代码: service.exampleMethod(RedVehicle.class); service.exampleMethod(YellowVehicle.class); 字段/方法: //List of vehicles //Vehicle has 2 subclasses, RedVehicle and YellowVehicle private List vehicles; //Having as the Class parameter stops the calling code working public void exampleMethod(Class type) { for(Vehicle v : vehicles) { if(v.getClass().equals(type)) { //do something } } }

在OO模型中添加双向关系的最佳实践

我正在努力想出一个在OO模型中添加双向关系的好方法。 假设有一个客户可以发出许多订单,也就是说客户和订单类之间存在一对多关联,需要在两个方向上遍历:对于特定客户,应该可以告诉所有订单他们已下订单,对于订单,应该可以告诉客户。 这是一段Java代码,虽然这个问题主要与语言无关: class Customer { private Set orders = new HashSet (); public void placeOrder (Order o) { orders.add(o); o.setCustomer(this); } } class Order { private Customer customer; public void setCustomer (Customer c) { customer = c; } } 让我感到困惑的是,鉴于模特有人可以轻易打电话: o.setCustomer(c); 而不是正确的 c.placeOrder(o); 形成单向链路而不是双向链路。 仍在学习OOP,任何人都可以请求帮助解决这个问题的惯用和实用方法,而不诉诸“反思”或花哨的框架(无论如何都依赖于反思)。 PS有一个类似的问题: 在我的java模型中管理双向关联 ,但我觉得它不能回答我的请求。 PSS任何链接到在db4o之上实现业务模型的现实项目的源代码都非常感谢!