2017-01-29 6 views
5

У меня есть конструктор, который получает HashSet и HashMap. Мне нужно запустить проверку проверки на один hashMAp и объединить его с hashSet, так как «super» должен получить только один hashSet. я не могу найти способ сделать это, как я получаю следующее сообщение об ошибке: cannot reference this before supertype constructorКак запустить функцию перед вызовом super в java?

Пример:

public class A extends B { 
    public A(HashSet<Obj> h1, HashMap<UID,Objects> m1) { 
    super(new C (h1)); //h1 should contain changes related to m1.. 
} 

Я хочу сделать что-то вроде этого:

public class A extends B { 
     public A(HashSet<Obj> h1, HashMap<UID,Objects> m1) { 
     runMyFunc(h1,m1); 
     super(new C (h1)); 
    } 



runMyFunc(HashSet<Obj> h1, HashMap<UID,Objects> m1){ 
     //do checks 
     //more checks... 
     // if something then h1.setUid(m1.get(0))... 
     return h1; 
    } 

Я думал, преобразуя конструктор к частному, а затем запустить его следующим образом:

public class A extends B { 
    private A(HashSet<Obj> h1) { 
    super(new C (h1)); 
} 

public A(HashSet<Obj> h1, HashMap<UID,Objects> m1) { 
    runMyFunc(h1,m1); 
    this(h1); 
} 

b это тоже не сработало.

Не могли бы вы посоветоваться?

+0

Не можете ли вы просто задать поле 'super' в конце вызовов конструктора' A'? –

+2

Вызов 'super()' или 'this()' должен быть первой строкой в ​​конструкторе. 'super()' вызывается автоматически (без аргументов), если вы не вставляете его самостоятельно. Вы можете обойти проблему, используя заводской метод. – DJX

ответ

5

Сделайте свой метод static и убедитесь, что он возвращает ваш новый h1.

public static HashSet<Obj> runMyFunc(HashSet<Obj> h1, HashMap<UID,Objects> m1) { 
    // Some mutation to h1 
    return h1; 
} 

Используйте его в первой строке следующим образом:

this(runMyFunc(h1,m1)); 

Почему я в состоянии использовать статические методы, а не методы экземпляра?

Прежде чем вы сможете позвонить своим методам, объект-родитель должен быть создан для того, чтобы компилятор не мог получить доступ к атрибутам/методам/тем, которые еще недоступны. Статические методы безопасны по определению, не могут получить доступ к такому из них.

Похожие вопросы

Why does this() and super() have to be the first statement in a constructor?

Constructor call must be the first statement in a constructor

+0

Отформатируйте свой ответ. – CKing

+0

Я нахожусь на мобильном телефоне, не могли бы вы его отредактировать? – AnixPasBesoin

+1

Вы также должны иметь возможность форматировать и на мобильных устройствах. В любом случае .. done – CKing

6

Просто сделайте runMyFuncстатический и вызывать его как функцию, где вы используете возвращаемое значение в super вызова. Это разрешено:

public class A extends B { 
    public A(HashSet<Obj> h1, HashMap<UID,Objects> m1) { 
    // Invoke as function rather than by itself on a separate line 
    super(new C (runMyFunc(h1,m1))); 
    } 

    // Make method static 
    public static HashSet<Obj> runMyFunc(HashSet<Obj> h1, HashMap<UID,Objects> m1) { 
    //do checks 
    //more checks... 
    // if something then h1.setUid(m1.get(0))... 
    return h1; 
    } 
Смежные вопросы