Почти все ответы либо используют Reflections
, либо читают файлы классов из файловой системы. Если вы попытаетесь прочитать классы из файловой системы, вы можете получить ошибки при упаковке своего приложения как JAR или другого. Также вы можете не использовать отдельную библиотеку для этой цели.
Вот еще один подход, который является чистой java и не зависит от файловой системы.
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.StandardLocation;
import javax.tools.ToolProvider;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
public class PackageUtil {
public static Collection<Class> getClasses(final String pack) throws Exception {
final StandardJavaFileManager fileManager = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null);
return StreamSupport.stream(fileManager.list(StandardLocation.CLASS_PATH, pack, Collections.singleton(JavaFileObject.Kind.CLASS), false).spliterator(), false)
.map(javaFileObject -> {
try {
final String[] split = javaFileObject.getName()
.replace(".class", "")
.replace(")", "")
.split(Pattern.quote(File.separator));
final String fullClassName = pack + "." + split[split.length - 1];
return Class.forName(fullClassName);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.toCollection(ArrayList::new));
}
}
Java 8 не является обязательным. Вы можете использовать для циклов вместо потоков. И вы можете проверить это так
public static void main(String[] args) throws Exception {
final String pack = "java.nio.file"; // Or any other package
PackageUtil.getClasses(pack).stream().forEach(System.out::println);
}
Тернарного оператора нужно обычно избегать, но эта форма может быть довольно читаемой:
result = (foo == bar) ? result1 :
(foo == baz) ? result2 :
(foo == qux) ? result3 :
(foo == quux) ? result4 :
fail_result;
Таким образом, условие и результат держатся вместе на той же строке, и довольно легко скользить вниз и понять то, что продолжается.
Вложенные тернарные операторы PHP ведут себя по-разному.
Этот синтаксис проходит все следующие тесты. На основе http://deadlytechnology.com/web-development-tips/php-ternary-syntax/
$myvar = ($x == $y)
?(($x == $z)?'both':'foo')
:(($x == $z)?'bar':'none');
.
См .: http://au.php.net/ternary
Пример № 3 «Неочевидное тройное поведение» объясняет, почему следующее не работает в PHP:
$x = 1;
$y = 2;
$z = 3;
$myvar = ($x == $y)
? "foo"
: ($x == $z)
? "bar"
: "none";
$myvar == 'none'; // Good
$x = 1;
$y = 2;
$z = 1;
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";
$myvar == 'bar'; // Good
$x = 1;
$y = 1;
$z = 3;
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";
$myvar == 'bar'; // Bad!
$x = 1;
$y = 1;
$z = 1;
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";
$myvar == 'bar'; // Bad!
Я лично только использую его для присвоения переменной (в Java), например:
String var = (obj == null) ? "not set" : obj.toString();
и (другой пример) при использовании функции, которая не позволяет пустой параметр, такой как:
String val; [...]
int var = (val == null) ? 0 : Integer.parseInt(val);
Imran, Вы отформатировали это красиво. Однако тернарный оператор действительно имеет тенденцию становиться нечитабельным, поскольку Вы вкладываете больше чем два. если еще блок может дать Вам дополнительный уровень понятного вложения. Кроме того, используйте функцию или табличное программирование.
Я склонен не использовать тернарный оператор вообще, поскольку я нахожу если.. еще намного более читаемый.
Я не использую его. Это всегда пахло мне как попытка оставить свободное место и ввод в исходном коде с ожиданием что маленький источник == более эффективный скомпилированный код.
я не нахожу его читаемым вообще, но большая часть этого - то, потому что я просто никогда не использую его.
Я склонен включать условие в круглые скобки: (== b)? 1: 0
тернарные операторы являются короткими эффективными способами записать простой если операторы. Они не должны быть вложены или не трудные читать. Помните: Вы пишете программное обеспечение однажды, но, читается 100 раз. Должно быть легче читать, чем запись.
I стиля иногда использование, которое я поднимаю, так как это не было упомянуто, похож на это:
$result = ($x == y)
? "foo"
: "bar";
.. но обычно только если помещение всего этого на одной строке делает его слишком долго. Я нахожу, что, имея = ? :
все выстраиваются в линию, заставляет его выглядеть более опрятным.
Я пытаюсь не использовать тернарный оператор для записи вложенных условий. Это игнорирует удобочитаемость и не обеспечивает дополнительного значения по использованию условного выражения.
, Только если это может соответствовать на одной строке, и это совершенно ясно, что это означает, я использую его:
$value = ($a < 0) ? 'minus' : 'plus';
Лично, я только использую тернарный оператор, если он соответствует на одной строке. Если это должно охватить, то время для старого доброго
if else if else
Я возражу с единым мнением. Я - вид подобного Imran с моим стилем условного оператора. Если это соответствует чисто на одной строке, я сохраняю его на одной строке. Если это не соответствует чисто на одной строке, я действительно повреждаю его, но я использую только единственную вкладку (4 пробелов; мне установили VS для вставки пробелов для вкладок) для отступа. Я сразу не перехожу к if
- else
, потому что много времени условный оператор имеет больше смысла контекстуально. (Если это не имеет смысла контекстуально, однако, я просто не использую его.)
кроме того, я не вкладываю условные операторы. В той точке я действительно нахожу слишком трудным читать, и пора перейти к более подробному if
- else
стиль.
"Изобретенный пример" то, как я расположил бы его с отступом, за исключением того, что я сделаю отступ от левого поля, не на основе того, где (или независимо от того, что находится на строке выше.
троичным хулителям - удобочитаемость является точкой. Если Вы не думаете, что это делает для большего количества читаемого кода, не используйте его. Но я нахожу вопреки иметь место, по крайней мере, часть времени.