2013-11-08 3 views
0

Я пытаюсь изучить темы, и у меня есть проблема. Поскольку метод run() является общедоступным() доступом, поэтому любой, кто может ссылаться на мой экземпляр класса, может его использовать. Поэтому я хочу предотвратить это, и есть способ использовать анонимный внутренний класс. Но я слышал, что это можно сделать, используя currentThread и сравнить его с заданным потоком. Как я могу это достичь?Как предотвратить метод run()?

Предположим, что это:

class OnlyConcept implements Runnable { 

    OnlyConcept() { 

    new Thread(this).start(); 
} 

public void run() { 

// call methods or do something meaningful 
} 

} 
+0

Вместо этого вы можете использовать внутренний или анонимный экземпляр «Runnable». – MadProgrammer

+0

. Вы обеспокоены безопасностью? Если это так, вы обязательно не решает проблему, не позволяя другому программисту, имеющему доступ к вашему классу, вызывать данный метод. – Tarik

+0

Вы не можете предотвратить случай, когда ваш метод 'run' вызывается, потому что злоумышленник может использовать отражение. Вы можете только предотвратить этот код r не случайно. Но даже этого, вероятно, не произойдет. –

ответ

2

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

Одним из худших подходов является проверка некоторых вещей после выполнения вашего потока/runnable. Thread.currentThread() дает вам доступ к текущей теме. При этом вы можете легко получить доступ к name или другому свойству этого потока и прекратить выполнение вашего специального потока. Однако это решение уступает другим решениям. Если ваш код основан на именах потоков и подобных смешных материалах, вы, скорее всего, столкнетесь с проблемами позже (например, если вы хотите выполнить свой код параллельно в двух разных потоках.

Ограничение доступа к вашему коду с использованием модификаторов видимости , инкапсулирование вашего класса в другом классе - это более чистый подход. Используйте это, если у вас есть шанс.

+0

Спасибо, ребята, это действительно помогает преодолеть некоторые проблемы. – Ernusc

1

Вы должны сделать две вещи:

  1. название вашего потока, путем передачи имени в Thread конструктор
  2. проверки Thread.currentThread.getName() на первой линии ваш метод run, бросьте какое-то подходящее исключение, например RuntimeException, если это не так.

Это не 100% надежный, потому что кто-то другой может назвать свою нить такой же, как ваша.

+0

Я предлагаю сравнить потоки по ссылке, то есть 'theOnlyAllowedThread == Thread.currentThread()'. –

+2

@RolandIllig, который тогда потребует лишь немного отражения, чтобы изменить 'theOllyAllowedThread'. Если кто-то абсолютно хочет использовать вещи, которые он не должен использовать, чертовски сложно предотвратить это. Почему бы не просто создать класс в соответствии с принципами OO и надеяться, что потенциальный пользователь начнет думать, прежде чем пытается использовать этот код. – Matthias

+0

Спасибо, Робин, это выглядит кое-чем, что мне нужно знать. – Ernusc

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