Захотелось получить статистику Java исходников и узнать, сколько в среднем бывает параметров у методов, методов в классах, конструкторов и т. д. Вопрос не совсем праздный, потому что на основе этих да��ных можно вычислить оптимальный размер по умолчанию для контейнеров для этих сущностей в программной модели кода (AST), чтобы сэкономить память. В частности, речь идет о проекте Spoon. С помощью этой библиотеки я и провел анализ, кстати.
Что может быть логичнее, чем протестировать статистику исходников JDK, чтобы делать некие предположения о любом Java-коде. Попутно я собрал самые необычные экземпляры — например, методы с наибольшим кол-вом параметров.
Чтобы посмотреть на них, гуглите сигнатуру — первая ссылка должна быть на Javadoc или на GrepCode. Либо, если перед вами открыта IntelliJ IDEA, просто вставьте имя класса или метода после четверного нажатия Shift.
Я ограничился только пакетами java.*, javax.* и org.*, а также JDK 7, а не 8, потому что баги Eclipse-компилятора, на котором основан Spoon, не позволяют построить AST.
С точки зрения статистики — я считаю хорошим допущением, что количества всех рассматриваемых сущностей распределены по закону Пуассона, поэтому единственное число — среднее значение — неплохо описывает все распределение.
Но, при желании, вы можете провести более глубокий анализ, или протестировать свой проект: gist.github.com/leventov/1f8d8d470b9632bc3cc3
Среднее: 1,063
Среднее: 0,010
Среднее: 1,207
Среднее: 0,001
Многие даже не знают, что так бывает. В JDK нашлось аж четыре класса с параметризованными конструкторами. Хотя мне доводилось примерять эту фишку на практике, причем, кажется, даже не единожды.
Среднее: 0,117
Неожиданно не нашлось ни одного класса с более чем тремя типовыми параметрами. Мой личный рекорд — 8.
Среднее: 0,555
Среднее: 0,057
Тут, наоборот, авторы JDK любят блоки инициализации больше меня. Я никогда не писал больше одного блока на класс.
Среднее: 3,861
Среднее: 1,467
Среднее: 8,003
Среднее: 0,327
Что может быть логичнее, чем протестировать статистику исходников JDK, чтобы делать некие предположения о любом Java-коде. Попутно я собрал самые необычные экземпляры — например, методы с наибольшим кол-вом параметров.
Чтобы посмотреть на них, гуглите сигнатуру — первая ссылка должна быть на Javadoc или на GrepCode. Либо, если перед вами открыта IntelliJ IDEA, просто вставьте имя класса или метода после четверного нажатия Shift.
Я ограничился только пакетами java.*, javax.* и org.*, а также JDK 7, а не 8, потому что баги Eclipse-компилятора, на котором основан Spoon, не позволяют построить AST.
С точки зрения статистики — я считаю хорошим допущением, что количества всех рассматриваемых сущностей распределены по закону Пуассона, поэтому единственное число — среднее значение — неплохо описывает все распределение.
Но, при желании, вы можете провести более глубокий анализ, или протестировать свой проект: gist.github.com/leventov/1f8d8d470b9632bc3cc3
Параметры методов
Среднее: 1,063
| Кол-во | Метод |
|---|---|
| 12 | java.lang.String layoutCompoundLabel(javax.swing.JComponent,java.awt.FontMetrics,java.lang.String,javax.swing.Icon,int,int,int,int,java.awt.Rectangle,java.awt.Rectangle,java.awt.Rectangle,int) |
| 12 | void drawChunk(java.awt.Image,java.awt.Graphics,boolean,int,int,int,int,int,int,int,int,boolean) |
| 12 | java.lang.String layoutText(javax.swing.plaf.synth.SynthContext,java.awt.FontMetrics,java.lang.String,javax.swing.Icon,int,int,int,int,java.awt.Rectangle,java.awt.Rectangle,java.awt.Rectangle,int) |
| 14 | void paintRow(javax.swing.tree.TreeCellRenderer,javax.swing.tree.DefaultTreeCellRenderer,javax.swing.plaf.synth.SynthContext,javax.swing.plaf.synth.SynthContext,java.awt.Graphics,java.awt.Rectangle,java.awt.Insets,java.awt.Rectangle,java.awt.Rectangle,javax.swing.tree.TreePath,int,boolean,boolean,boolean) |
| 15 | void initMouseEvent(java.lang.String,boolean,boolean,org.w3c.dom.views.AbstractView,int,int,int,int,int,boolean,boolean,boolean,boolean,short,org.w3c.dom.events.EventTarget) |
| 16 | void setRaster(int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int) |
Типовые параметры методов
Среднее: 0,010
| Кол-во | метод |
|---|---|
| 2 | <K,V> java.util.Map checkedMap(java.util.Map,java.lang.Class,java.lang.Class) |
| 2 | <K,V> K keyOrNull(java.util.TreeMap$Entry) |
| 2 | <K,V> java.util.concurrent.ConcurrentHashMap$HashEntry entryAt(java.util.concurrent.ConcurrentHashMap$HashEntry[],int) |
| 2 | <U,W> java.util.concurrent.atomic.AtomicReferenceFieldUpdater newUpdater(java.lang.Class,java.lang.Class,java.lang.String) |
| 2 | <K,V> java.util.Map newHashMap() |
| 2 | <M,I> javax.swing.RowFilter andFilter(java.lang.Iterable) |
| 2 | <R,P> R accept(javax.lang.model.element.AnnotationValueVisitor,P) |
| 2 | <R,P> R accept(javax.lang.model.element.ElementVisitor,P) |
| 2 | <R,P> R accept(javax.lang.model.type.TypeVisitor,P) |
| 3 | <K,V,T> java.util.Collections$CheckedMap$CheckedEntrySet$CheckedEntry checkedEntry(java.util.Map$Entry,java.lang.Class) |
Параметры конструкторов
Среднее: 1,207
| Кол-во | Конструктор |
|---|---|
| 12 | java.awt.LinearGradientPaintContext(java.awt.LinearGradientPaint,java.awt.image.ColorModel,java.awt.Rectangle,java.awt.geom.Rectangle2D,java.awt.geom.AffineTransform,java.awt.RenderingHints,java.awt.geom.Point2D,java.awt.geom.Point2D,float[],java.awt.Color[],java.awt.MultipleGradientPaint$CycleMethod,java.awt.MultipleGradientPaint$ColorSpaceType) |
| 12 | java.lang.management.ThreadInfo(java.lang.Thread,int,java.lang.Object,java.lang.Thread,long,long,long,long,java.lang.StackTraceElement[],java.lang.Object[],int[],java.lang.Object[]) |
| 12 | javax.swing.event.MenuDragMouseEvent(java.awt.Component,int,long,int,int,int,int,int,int,boolean,javax.swing.MenuElement[],javax.swing.MenuSelectionManager) |
| 13 | java.awt.event.MouseWheelEvent(java.awt.Component,int,long,int,int,int,int,int,int,boolean,int,int,int) |
| 13 | java.util.SimpleTimeZone(int,java.lang.String,int,int,int,int,int,int,int,int,int,int,int) |
| 14 | java.awt.event.MouseWheelEvent(java.awt.Component,int,long,int,int,int,int,int,int,boolean,int,int,int,double) |
| 15 | java.awt.RadialGradientPaintContext(java.awt.RadialGradientPaint,java.awt.image.ColorModel,java.awt.Rectangle,java.awt.geom.Rectangle2D,java.awt.geom.AffineTransform,java.awt.RenderingHints,float,float,float,float,float,float[],java.awt.Color[],java.awt.MultipleGradientPaint$CycleMethod,java.awt.MultipleGradientPaint$ColorSpaceType) |
| 16 | javax.imageio.spi.ImageReaderWriterSpi(java.lang.String,java.lang.String,java.lang.String[],java.lang.String[],java.lang.String[],java.lang.String,boolean,java.lang.String,java.lang.String,java.lang.String[],java.lang.String[],boolean,java.lang.String,java.lang.String,java.lang.String[],java.lang.String[]) |
| 18 | javax.imageio.spi.ImageReaderSpi(java.lang.String,java.lang.String,java.lang.String[],java.lang.String[],java.lang.String[],java.lang.String,java.lang.Class[],java.lang.String[],boolean,java.lang.String,java.lang.String,java.lang.String[],java.lang.String[],boolean,java.lang.String,java.lang.String,java.lang.String[],java.lang.String[]) |
| 18 | javax.imageio.spi.ImageWriterSpi(java.lang.String,java.lang.String,java.lang.String[],java.lang.String[],java.lang.String[],java.lang.String,java.lang.Class[],java.lang.String[],boolean,java.lang.String,java.lang.String,java.lang.String[],java.lang.String[],boolean,java.lang.String,java.lang.String,java.lang.String[],java.lang.String[]) |
Типовые параметры конструкторов
Среднее: 0,001
Многие даже не знают, что так бывает. В JDK нашлось аж четыре класса с параметризованными конструкторами. Хотя мне доводилось примерять эту фишку на практике, причем, кажется, даже не единожды.
| Кол-во | Конструктор |
|---|---|
| 1 | javax.management.StandardEmitterMBean(T,java.lang.Class,boolean,javax.management.NotificationEmitter) |
| 1 | javax.management.StandardMBean(T,java.lang.Class) |
| 1 | javax.management.openmbean.OpenMBeanAttributeInfoSupport(java.lang.String,java.lang.String,javax.management.openmbean.OpenType,boolean,boolean,boolean,T) |
| 1 | javax.management.openmbean.OpenMBeanParameterInfoSupport(java.lang.String,java.lang.String,javax.management.openmbean.OpenType,T) |
Типовые параметры классов
Среднее: 0,117
Неожиданно не нашлось ни одного класса с более чем тремя типовыми параметрами. Мой личный рекорд — 8.
| Кол-во | Класс |
|---|---|
| 2 | class javax.swing.DefaultRowSorter |
| 2 | class javax.swing.DefaultRowSorter$ModelWrapper |
| 2 | class javax.swing.RowFilter |
| 2 | class javax.swing.RowFilter$AndFilter |
| 2 | class javax.swing.RowFilter$Entry |
| 2 | class javax.swing.RowFilter$NotFilter |
| 2 | class javax.swing.RowFilter$OrFilter |
| 2 | class javax.swing.SwingWorker |
| 2 | class javax.xml.bind.annotation.adapters.XmlAdapter |
| 3 | class java.util.Collections$CheckedMap$CheckedEntrySet$CheckedEntry |
Реализованные интерфейсы
Среднее: 0,555
| Кол-во | Класс |
|---|---|
| 6 | class javax.swing.plaf.basic.BasicComboBoxUI$Handler |
| 6 | class javax.swing.plaf.basic.BasicTabbedPaneUI$Handler |
| 6 | class javax.swing.plaf.basic.BasicTableUI$Handler |
| 6 | class javax.swing.text.JTextComponent$AccessibleJTextComponent |
| 7 | class javax.swing.JTable |
| 7 | class javax.swing.JTable$AccessibleJTable |
| 7 | class javax.swing.plaf.basic.BasicInternalFrameUI$Handler |
| 7 | class javax.swing.plaf.basic.BasicListUI$Handler |
| 10 | class javax.swing.plaf.basic.BasicTreeUI$Handler |
| 17 | class java.awt.AWTEventMulticaster |
Анонимные блоки инициализации
Среднее: 0,057
Тут, наоборот, авторы JDK любят блоки инициализации больше меня. Я никогда не писал больше одного блока на класс.
| Кол-во | Класс |
|---|---|
| 2 | class javax.management.remote.rmi.RMIConnector |
| 2 | class javax.swing.text.html.HTML |
| 3 | class java.lang.invoke.CallSite |
| 3 | class java.lang.invoke.MethodHandle |
| 3 | class java.lang.invoke.MethodHandleNatives |
| 3 | class java.math.BigInteger |
| 3 | class java.net.InetAddress |
| 3 | class java.util.zip.ZipFile |
| 3 | class javax.swing.text.rtf.RTFReader |
| 6 | class java.lang.invoke.LambdaForm |
Поля
Среднее: 3,861
| Кол-во | Класс |
|---|---|
| 84 | class java.awt.Event |
| 84 | class java.util.Calendar |
| 93 | class javax.swing.plaf.nimbus.InternalFrameTitlePaneMaximizeButtonPainter |
| 98 | class java.awt.Component |
| 99 | enum java.lang.Character$UnicodeScript |
| 130 | class java.awt.color.ICC_Profile |
| 140 | class javax.swing.plaf.nimbus.FileChooserPainter |
| 209 | class java.awt.event.KeyEvent |
| 213 | class java.lang.Character$UnicodeBlock |
| 223 | class java.awt.PageAttributes$MediaType |
Конструкторы
Среднее: 1,467
| Кол-во | Класс |
|---|---|
| 10 | class java.lang.invoke.MemberName |
| 10 | class java.net.Socket |
| 10 | class java.sql.BatchUpdateException |
| 12 | class java.math.BigInteger |
| 13 | class java.util.Scanner |
| 14 | class java.awt.Dialog |
| 16 | class java.util.Formatter |
| 16 | class javax.swing.JDialog |
| 17 | class java.lang.String |
| 17 | class java.math.BigDecimal |
Методы
Среднее: 8,003
| Кол-во | Класс |
|---|---|
| 137 | class javax.swing.plaf.synth.ParsedSynthStyle$DelegatingPainter |
| 143 | class javax.swing.plaf.nimbus.SynthPainterImpl |
| 143 | class javax.swing.plaf.synth.ImagePainter |
| 145 | class java.awt.Window |
| 147 | class javax.swing.JTree |
| 148 | class javax.swing.plaf.nimbus.FileChooserPainter |
| 152 | class java.awt.Container |
| 187 | class javax.swing.JComponent |
| 196 | class javax.swing.JTable |
| 331 | class java.awt.Component |
Вложенные классы
Среднее: 0,327
| Кол-во | Класс |
|---|---|
| 20 | class javax.swing.plaf.metal.MetalBorders |
| 20 | class javax.swing.text.html.CSS |
| 21 | class javax.swing.plaf.basic.BasicTreeUI |
| 21 | class javax.swing.text.html.HTMLDocument$HTMLReader |
| 27 | class java.beans.MetaData$java_util_Collections |
| 30 | class javax.swing.plaf.metal.MetalIconFactory |
| 33 | class javax.swing.text.DefaultEditorKit |
| 36 | class java.util.Collections |
| 48 | class java.beans.MetaData |
| 59 | class java.util.regex.Pattern |
