MVC в Java, просто нужно немного указывать в правильном направлении - PullRequest
3 голосов
/ 21 января 2012

Я не полный новичок в программировании. Я кодировал на том или ином языке в течение 20 лет. Просто не на Java. Мой основной язык - Objective C на iOS и OS X.

Я занимаюсь разработкой Java-приложения и пытаюсь реализовать шаблон MVC, который применяется в iOS. т. е. мой пользовательский интерфейс, модель данных - это отдельные классы, а третий класс, контроллер - это «клей».

То, что я пытаюсь сделать, очень просто в задаче c, и я всю ночь искал в Google, пытаясь найти эквивалентный шаблон в java.

Например, у меня есть два класса. Класс A и класс B. Класс A реализует функцию main (). main создает экземпляр класса B. Мне нужен класс B, чтобы иметь возможность вызывать экземпляр методов класса A. Класс Objective-C класса B будет иметь указатель на класс A в качестве инварианта. Поэтому, когда класс A создает экземпляр класса B, он устанавливает указанный указатель на себя, поэтому класс B теперь имеет ссылку на класс A и может вызывать его открытые методы.

Но, похоже, я не могу сделать это из класса A, где он устанавливает класс B (в main () класса A.) Netbeans жалуется на невозможность доступа к нестатической переменной из статического метода к чему-то в этом роде казалось, что main () должен быть статическим.

Я думаю, может быть, я мог бы добавить еще один аналог класса для AppDeleagte в Какао. Так что у меня есть main () в каком-то другом классе, и он будет создавать экземпляр MVC.

Я не вижу этого очевидного ограничения в отношении статики. Единственный раз, когда я столкнулся с этим, был локальный, который должен был сохранить свое значение через последовательные вызовы методов.

Я никогда не объявлял метод статическим и не сталкивался с проблемами при доступе к переменным, которые обычно находятся в области видимости.

Это кажется таким простым, я чувствую, что упускаю что-то очевидное.

PS Я использую NetBeans 7.01 и просто погружаюсь в Java самостоятельно. Я пытался получить помощь в чатах Yahoo и от друга на fb, но ему пришлось бежать.

Я ценю любую помощь, которую кто-либо оказывает в этом.

Спасибо за чтение этого блеска, и спокойной ночи.

Ответы [ 3 ]

3 голосов
/ 21 января 2012

Здесь есть пара вопросов, я постараюсь разбить их и ответить хотя бы на некоторые из них:

Во-первых, чтобы иметь возможность вызывать методы экземпляра A, необходимо предоставить экземплярБ, когда его экземпляр.Следующий пример делает именно это:

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
    }
}

static в Java в значительной степени эквивалентен классу global (, что делает его очень опасным ключевым словом в ООП и, честно говоря, должноизбегать любой ценой ).Почти ко всему остальному нужно обращаться способом ООП или, другими словами, через экземпляр объекта.

Хотя наличие глобального состояния для некоторых вещей может показаться разумным (, например, конфигурация приложения )в долгосрочной перспективе это не так - вы так же хорошо создаете казалось бы одноэлементный объект, который содержит состояние конфигурации, но может быть изменен на лету, если это необходимо;таким образом, вы можете избежать перезапуска приложения при изменении конфигурации.

Я надеюсь, что это поможет и ответит на ваши вопросы, и не стесняйтесь спрашивать еще больше при необходимости.

2 голосов
/ 21 января 2012

Как только вы преодолеете это препятствие (как описано другими), вы увидите, что дух Java поддерживает разработку MVC. Есть даже интерфейсы Observer и Observable, которые вы можете реализовать, чтобы вы могли легко подключать сети объектов, управляемых событиями.

Вся инфраструктура Swing также опирается на концепции MVC, поэтому у вас будет базовая модель, на которую можно накладывать несколько представлений. (Вы можете даже подумать о создании своего графического интерфейса с использованием той же самой инфраструктуры, на которой построен Netbeans, так что вы получите многократное использование зрелых компонентов графического интерфейса.)

Хотя Java является достаточно сложной платформой (хотя сам язык обезоруживающе прост). Прежде чем углубляться в это, стоит почитать книгу или иметь хороший справочный материал, чтобы убедиться, что вы правильно структурировали вещи.

2 голосов
/ 21 января 2012

Объявление статического метода означает, что метод является методом класса, а не методом экземпляра этого класса.Итак, очевидно, что this не имеет смысла в статическом методе: не существует экземпляра класса, к которому мог бы обратиться this.

То, что вы хотите, это:

public class ClassA {

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

Прочитайте учебник о статических членах .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...