Java中的MVC,只需要指向正确的方向
我不是个编程高手。我已经用一种或另一种语言编写代码20年了。只是不是在Java中。我的主要语言是iOS和OSX上的Objective C 我正在开发一个java应用程序,并试图实现iOS强制实施的MVC模式。i、 我的UI、数据模型是独立的类,第三个类、控制器是“粘合剂” 在objective c中,我想做的是非常简单,我已经搜索了google一整夜,试图找到java中的等效模式 例如,我有两门课。类A和类B。类A实现main()。main实例化类B。我需要类B能够调用类A的方法的实例。I'n Objective-C类B将有一个指向类a的指针作为因瓦。 因此,当类A实例化类B时,它将所述指针设置为自身,因此类B现在有对类A的引用,并且可以调用其公共方法 但我似乎无法从类A中做到这一点,因为类A不满足类B(在类A main()中)。Netbeans抱怨无法从静态方法访问非静态变量之类的内容。似乎main()需要是静态的 我在想也许我可以在Cocoa中的AppDelegte中添加另一个类类似物。 所以我在另一个类中有一个main(),它将实例化MVC 我对静态没有明显的限制,我唯一一次遇到它的地方是需要通过连续的方法调用来保持它的值 我从未声明过一个静态方法,也没有在访问通常在作用域中的任何变量时遇到任何问题 这看起来很简单,我觉得我遗漏了一些明显的东西 PS我使用的是NetBeans 7.01,我只是一个人潜入Java。我试着从雅虎聊天室和fb的一个朋友那里获得帮助,但他不得不跑掉 我感谢任何人在这方面给予的帮助Java中的MVC,只需要指向正确的方向,java,design-patterns,Java,Design Patterns,我不是个编程高手。我已经用一种或另一种语言编写代码20年了。只是不是在Java中。我的主要语言是iOS和OSX上的Objective C 我正在开发一个java应用程序,并试图实现iOS强制实施的MVC模式。i、 我的UI、数据模型是独立的类,第三个类、控制器是“粘合剂” 在objective c中,我想做的是非常简单,我已经搜索了google一整夜,试图找到java中的等效模式 例如,我有两门课。类A和类B。类A实现main()。main实例化类B。我需要类B能够调用类A的方法的实例。I'n
感谢您阅读本文,祝您晚安。声明方法静态意味着该方法是该类的方法,而不是该类实例的方法。因此,显然,
此
在静态方法中没有任何意义:此无法引用该类的实例
你想要的是:
public class ClassA {
public static void main(String[] args) {
ClassA a = new ClassA();
ClassB b = new ClassB(a);
...
}
}
阅读。这里有几个问题,我将尝试将它们分解,并至少回答其中一些问题: 首先,为了能够调用A的实例方法,您需要在实例化B时将实例提供给B。下面的示例正是这样做的:
public class A {
public static void main(String[] args) {
new A().run();
}
public void run() {
B b = new B(this);
b.run();
}
public void foo() {
System.out.println("2.");
}
}
public class B {
private final A a;
public B(A a) { this.a = a; }
public void run() {
System.out.println("1.");
a.foo();
}
}
// Output:
// 1.
// 2.
这里重要的区别在于Java并没有神奇地让您访问调用堆栈或当前执行目标的“父对象”。这意味着您确实需要将所有内容都向前移植到新实例,如果您想调用它们
其次,正如NetBeans所指出的,您不能从静态上下文访问非静态成员
public class A {
public static void foo() {}
public void bar() {}
public static int i = 0;
public int j = 1;
}
public class B {
public static void main(String[] args) {
A.foo(); // works because foo() is static
A.bar(); // compile error
new A().bar(); // works because now you're calling
// non-static instance's bar() method.
// Pretty much the same applies to fields;
A.i = 2; // works
A.j = 2; // compile error, once again
new A().j = 2; // works
}
}
Java中的static
相当于一个类global(这使得它在OOP中是一个非常危险的关键字,应该不惜一切代价避免)。几乎所有其他内容都需要以OOP方式访问,或者换句话说,通过对象实例访问
虽然对某些事情拥有全局状态听起来可能是合理的(比如应用程序的配置),但从长远来看,情况并非如此-您可以创建一个看似单一的对象,该对象包含配置状态,但可以在需要时动态修改;这样可以避免在配置更改时重新启动应用程序
我希望这有助于回答您的问题,如果需要,请毫不犹豫地提出更多问题。一旦您克服了这个障碍(如其他人所述)您将看到Java的精神支持MVC开发,甚至可以实现观察器和可观察接口,以便轻松连接事件驱动对象的网络
整个Swing框架也依赖于MVC概念,因此您将有一个可以覆盖多个视图的基础模型。(甚至可以考虑使用与NETBESE相同的框架来构建您的GUI,这样您就可以大量重用成熟的GUI组件。)
尽管Java是一个相当复杂的平台(尽管它本身非常简单)。在深入研究它之前,阅读一本书或手头有一些好的参考资料是值得的,以确保你正确地组织事物。这不是“需要一点指向正确的方向”关于MVC,这不是理解该语言的一个基本特性,静态范围。看起来你可能想在走路之前先跑。我建议你回去看看一本好的Java教程,或者“Java for C程序员”之类的文章,以确保你对该语言有坚实的基础。如果你已经知道的话Objective C,这将有点乏味,但至少会很快。感谢所有回答的人,尤其是Esko。我认为这将使我达到我需要的位置。静态就像一个类全局,这将解释为什么我在Java上下文中不理解它们,因为我在Objective-C中的编程经验使我保持了严格的OOP范式。我我很确定它们在ObjC中没有这样的行为,但我不确定,因为我从来没有真正使用过它们。这让事情变得更清楚了。现在我必须在构造函数中传递实例a对实例be的引用吗?在我的特定情况下,类a是一个控制器,类B是我的UI(用可可语来说是一个视图)。作为一个UI,我在NetBeans IDE中创建了它,它甚至不允许我在任何生成的代码中的注释前插入空格。我可以看出我有多么困惑,因为在objective-c中,类实际上也是对象,并且类对象本身也有上下文,就像它对实例一样。NetBeans允许修改视图的构造函数。不要将构造函数与initComponents方法混淆,后者只是一个重新定义