Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的MVC,只需要指向正确的方向_Java_Design Patterns - Fatal编程技术网

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

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

我不是个编程高手。我已经用一种或另一种语言编写代码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的一个朋友那里获得帮助,但他不得不跑掉

我感谢任何人在这方面给予的帮助


感谢您阅读本文,祝您晚安。

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

你想要的是:

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方法混淆,后者只是一个重新定义