Java onCreate с параметром как в initWithParameter c ++ - PullRequest
0 голосов
/ 22 апреля 2011

может быть слишком простым, но я не могу найти правильный путь.

В C ++ я могу написать initWithParameter: xxx для создания экземпляра класса, а затем в инициализации установить некоторые переменные экземпляра, заданные значением во время инициализации.

В Java я не знаю, как это сделать.В настоящее время я делаю следующее:

public class SpecialScreen extends BASEScreen{
private static final int ACTIVITY_1 = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); //create the instance
    defineScreenType (ACTIVITY_1); //second call to set the instance variable
    presentOnScreen();
}

На BASEScreen:

public class BASEScreen extends Activity {
private Integer activityCode; // which activity should I do?

@Override
public void onCreate(Bundle savedInstanceState) {  // the creation
    super.onCreate(savedInstanceState);
}

// the setting of the instance variable
public void defineScreenType(int screenID) {
    activityCode = screenID;

}

Это не может быть лучшим способом сделать это.Как сделать это лучше?

Спасибо

ДОБАВЛЕНО, чтобы показать вызов SpecialScreen в BASEScreen:

    @Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    Intent i;
    switch (item.getItemId()) {
    case OTHER_PAGE_ID:
        // 
        if (activityCode == ACTIVITY_1) {
            i = new Intent(this, SpecialScreen2.class);
            i.putExtra("Task", ACTIVITY_2);
            startActivityForResult(i, ACTIVITY_2);
            finish();

        } else {
            i = new Intent(this, SpecialScreen1.class);
            i.putExtra("Task", ACTIVITY_1);
            startActivityForResult(i, ACTIVITY_1);
            finish();
        }

        return true;

ps Я знаю, что установка Extra больше не требуется,Так я делал до того, как получил два подкласса SpecialScreen и всегда вызывал BASEScreen с этим параметром.

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

Если я правильно понимаю ваш вопрос.Любой класс в Java может иметь один или несколько конструкторов.Каждый из них может не иметь ни параметров, ни некоторого набора параметров, которые вы передаете (хотя каждый из них должен иметь уникальный набор / порядок, чтобы компилятор мог определить, какой из них вы собираетесь использовать).

public class SpecialScreen extends BASEScreen {
    private static final int ACTIVITY_1 = 1;

    // There is a default constructor with no parameters provided for you
    // by default if you don't define any constructors.
    public SpecialScreen() {
       // I'm overriding the default constructor and this one will do 
       // something else.
       super(ACTIVITY_1);
    }

    // But you can also have ones like this.
    public SpecialScreen(int activity) {
       super(activity);
    }
}

Каждыйвызывается при выполнении нового, например:

BASEScreen porcupine = new SpecialScreen ();// Нет конструктора параметров.

или

BASEScreen porcupine = new SpecialScreen (5);// Конструктор, принимающий параметр.

2 голосов
/ 22 апреля 2011

Правильно, нет синтаксиса "по умолчанию", как в c ++. Вы должны сделать это в конструкторе. Имейте в виду, вам не нужно использовать метод setter, вы можете сделать activityCode защищенным, а не приватным, и просто сделайте:

activityCode = ACTIVITY_1;

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

Изменить в ответ на комментарии ниже:

Я прошу прощения за некоторую путаницу, поскольку я называл это "конструктором", когда это не так.

Если в BASEScreen вы измените доступ на protected с private

public class BASEScreen extends Activity {
    protected Integer activityCode;

Затем вы можете получить к нему доступ в подклассе SpecialScreen:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    activityCode = 1; // Or ACTIVITY_1 if you'd like
    presentOnScreen();
}
...