2016-10-17 3 views
0

Для задания мне нужно написать код для класса «State», который имеет все атрибуты о местоположении самолета.Java, запрещает классу вызывать открытый метод

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

Я не могу изменить структуру любого класса вообще или видимость. Мой профессор сказал использовать как «клон», так и логический. Как мне это сделать?

public void setSpeed(double speed) 
{ 
    if(method called by any class other than Airplane.java) 
    { 
     //throw exception 
    } 
    else 
    { 
     //continue setting speed 
    } 
} 
+1

Просьба показать [mcve] – OldProgrammer

+5

Честно говоря, назначение не имеет особого смысла. Это то, что вы не хотите делать в производственном коде. –

+1

- это метод 'State' и внутренний класс' Самолет'? – njzk2

ответ

2

Я согласен, что это требование не имеет смысла, но это может сделать это:

public void setSpeed(double speed) 
{ 
    if(!Airplane.class.equals(Thread.getCurrentThread().getStacktrace()[1].getClass())) 
    { 
    //throw exception 
0

Поскольку это не статические методы, мы можем использовать getClass(), чтобы проверить, кто называется методом и сравнить его с Airplane.class. Метод getStackTrace() велик, но не нужен здесь. Также мы должны использовать != вместо equals(Object), потому что мы хотим проверить фактический класс и не разрешить ситуацию, когда реализация Airplane.equals(Object) не проверяет подклассы.

public void something() { 
    if (Airplane.class != getClass()) { 
     throw new IllegalArgumentException("Cannot call from " + getClass()); 
    } 
    // and so on... 
} 
+0

Нет, это не работает. Это только терпит неудачу, если объект является подклассом «Airpane». Кроме того, генерируется ли исключение, полностью зависит от вызывающего класса. Например. 'new Airpane(). something()' не генерирует исключение независимо от того, где он вызван. – fabian

+0

Ах хороший момент. Мне придется подумать немного больше. – pmcevoy12

 Смежные вопросы

  • Нет связанных вопросов^_^