Статистика кода JDK 7

Захотелось получить статистику 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Кол-во Метод 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 java.util.Map checkedMap (java.util.Map, java.lang.Class, java.lang.Class) 2 K keyOrNull (java.util.TreeMap$Entry) 2 java.util.concurrent.ConcurrentHashMap$HashEntry entryAt (java.util.concurrent.ConcurrentHashMap$HashEntry[], int) 2 java.util.concurrent.atomic.AtomicReferenceFieldUpdater newUpdater (java.lang.Class, java.lang.Class, java.lang.String) 2 java.util.Map newHashMap () 2 javax.swing.RowFilter andFilter (java.lang.Iterable) 2 R accept (javax.lang.model.element.AnnotationValueVisitor, P) 2 R accept (javax.lang.model.element.ElementVisitor, P) 2 R accept (javax.lang.model.type.TypeVisitor, P) 3 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

© Habrahabr.ru