Java中的MVC,只需要指向一个正确的方向

时间:2012-01-21 11:22:14

标签: java design-patterns

我不是编程的总菜鸟。我用一种语言或另一种语言编写了20年。只是不在Java。我的主要语言是iOS和OS X上的Objective C.。

我正在开发一个Java应用程序,我正在尝试实现iOS强制执行的MVC模式。即我的UI,数据模型是单独的类和第三类,控制器是'胶水'。

我想要做的是在目标c中超级简单,我整晚都在搜索谷歌,试图在java中找到相同的模式。

例如我有两个班级。 A类和B类.A类实现main()。 main实例化B类。我需要B类才能调用A类方法的实例。我是Objective-C,B类有一个指向A类的指针作为一个invar。 因此,当A类实例化B类时,它会将所述指针设置为自身,因此B类现在具有对A类的引用,并且可以调用其公共方法。

但似乎我不能从A类中做到这一点,它会在B类中进行分类(在A类main()中.Netbeans抱怨无法从静态方法访问非静态变量到类似的东西。似乎main()需要是静态的。

我想也许我可以在Cocoa中为AppDeleagte添加另一个类模拟。 所以我在其他一些类中有一个main(),它会实例化MVC。

我对静态没有明显的限制。我遇到它的唯一一次是本地需要通过连续的方法调用保留其值。

我从未声明方法是静态的,也没有遇到访问通常在范围内的任何变量的任何问题。

这看起来很简单,我觉得我错过了一些明显的东西。

PS我正在使用NetBeans 7.01,而我只是自己潜入Java。我尝试过获取雅虎聊天室的帮助,以及fb上的朋友,但他必须跑步。

我感谢任何人给予的任何帮助。

感谢您阅读这段漫步,并度过了一个美好的夜晚。

3 个答案:

答案 0 :(得分:3)

这里有几个问题,我会尝试将它们分解并至少回答其中一些问题:

首先,为了能够调用A的实例方法,您需要在实例化时向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几乎相当于全局类(,这使得它在OOP中成为一个非常危险的关键字,老实说应该不惜一切代价避免)。几乎所有其他东西都需要以OOP方式访问,或者换句话说,通过对象实例访问。

虽然对于某些事情具有全局状态可能听起来合理(,例如应用程序的配置),但从长远来看却不是 - 你在创建一个看起来一样好< / em>包含配置状态的单例对象,但如果需要可以动态修改;这样,您可以避免在配置更改时重新启动应用程序。

我希望这会有所帮助并回答您的问题,如果需要,可以毫不犹豫地提出更多问题。

答案 1 :(得分:2)

声明方法静态意味着该方法是类的方法,而不是该类的实例的方法。所以,显然,this在静态方法中没有任何意义:this可以引用的类没有实例。

你想要的是这个:

public class ClassA {

    public static void main(String[] args) {
        ClassA a = new ClassA();
        ClassB b = new ClassB(a);
        ...
    }
}

阅读tutorial about static members

答案 2 :(得分:2)

一旦你克服了这个障碍(正如其他人所描述的那样),你会发现Java的精神支持MVC开发。甚至可以实现Observer和Observable接口,以便您可以轻松连接事件驱动对象的网络。

整个Swing框架也依赖于MVC概念,因此您将拥有一个可以覆盖多个视图的底层模型。 (您甚至可以考虑使用构建Netbeans的相同框架来构建GUI,这样您就可以大量重用成熟的GUI组件。)

Java虽然是一个相当复杂的平台(尽管语言本身非常简单)。这本书值得一读,或者在深入研究之前有一些好的参考资料,以确保你正确地构建东西。