...

воскресенье, 24 мая 2015 г.

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

Захотелось получить статистику Java исходников — сколько в среднем бывает параметров у методов, методов в классах, конструкторов и т. д. Вопрос не совсем праздный, потому что на основе этих данных можно вычислить оптимальный размер по умолчанию для контейнеров для этих сущностей в программной модели кода (AST), чтобы сэкономить память. В частности, речь идет о проекте Spoon. С помощью этой библиотеки я и провел анализ, кстати.

Что может быть логичнее, чем протестировать статистику исходников JDK, чтобы делать некие предположения о любом Java-коде. Попутно я собрал самые необычные экземпляры — например, методы с наибольшим кол-вом параметров. Чтобы посмотреть на них, гуглите сигнатуру — первая ссылка должна быть на Javadoc или на GrepCode. Либо, если перед вами открыта IntelliJ IDEA, просто вставьте имя класса или метода после четверного нажатия Shift.

Я ограничился только пакетами java.*, javax.* и org.*, а также JDK 7, а не 8, потому что баги Eclipse-компилятора, на котором основан Spoon, не позволяют построить AST.

С точки зрения статистики — я считаю хорошим допущением, что количества всех рассматриваемых сущностей распределены по закону Пуассона, поэтому единственное число — среднее значение — неплохо описывает все распределение.

Но, при желании, вы можете провести более глубокий анализ, или протестировать свой проект: http://ift.tt/1GwYThO

Параметры методов


Среднее: 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

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

Комментариев нет:

Отправить комментарий