Pull to refresh
33
0
Send message
Да, named и default аргументы я читаю в ООП/методах+конструкторах. Достаточно краткая тема. Или я чего-то не знаю?
Вот все, надо смотреть

D:\Program Files\Java\jdk1.8.0\bin>javap -p -c -v Demo
Classfile /D:/Program Files/Java/jdk1.8.0/bin/Demo.class
  Last modified Apr 22, 2015; size 1076 bytes
  MD5 checksum 7f7e8e8353c9bf7f6bf70c6c4858c5b8
  Compiled from "Demo.scala"
public class tmp.Demo
  SourceFile: "Demo.scala"
  InnerClasses:
       public static #42= #39 of #41; //Inclusive=class scala/collection/immutable/Range$Inclusive of class scala/collection/immutable/Range
  RuntimeVisibleAnnotations:
    0: #6(#7=s#8)
Error: unknown attribute
    ScalaSig: length = 0x3
     05 00 00
  minor version: 0
  major version: 50
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Utf8               tmp/Demo
   #2 = Class              #1             //  tmp/Demo
   #3 = Utf8               java/lang/Object
   #4 = Class              #3             //  java/lang/Object
   #5 = Utf8               Demo.scala
   #6 = Utf8               Lscala/reflect/ScalaSignature;
   #7 = Utf8               bytes
   #8 = Utf8               ♠☺§2A!☺☻☺♂\t!A)Z7p§♣↓◄a☺;na♫☺1C☺☺!\t9!\"D☺\t§♣I◄!B:dC
2♀↨BA♠\t♣↓\te.▼*fM\")Q☻☺C☺↔♣1A(←8jiz\"↕a♦\t♥!☺i◄A☺♣♠%☺!\taE☺☻MR◄A♥\t\t♥+uq!AF♫♫♥
]Q!☺G\r☻‼%lW.▲;bE2,'B☺♫\t♥)↓w♫∟7fGRLwN\♣♥9]\tQAU1oO▬L!AH►♥‼%s7\r\;tSZ,'B☺☼↑◄§\t‼
♥1☺#♥CA♦$‼\t!♥BA☻J]R♦
   #9 = Utf8               f
  #10 = Utf8               (I)Lscala/collection/immutable/Range$Inclusive;
  #11 = Utf8               scala/runtime/RichInt$
  #12 = Class              #11            //  scala/runtime/RichInt$
  #13 = Utf8               MODULE$
  #14 = Utf8               Lscala/runtime/RichInt$;
  #15 = NameAndType        #13:#14        //  MODULE$:Lscala/runtime/RichInt$;
  #16 = Fieldref           #12.#15        //  scala/runtime/RichInt$.MODULE$:Lscala/runtime/RichInt$;
  #17 = Utf8               scala/Predef$
  #18 = Class              #17            //  scala/Predef$
  #19 = Utf8               Lscala/Predef$;
  #20 = NameAndType        #13:#19        //  MODULE$:Lscala/Predef$;
  #21 = Fieldref           #18.#20        //  scala/Predef$.MODULE$:Lscala/Predef$;
  #22 = Utf8               intWrapper
  #23 = Utf8               (I)I
  #24 = NameAndType        #22:#23        //  intWrapper:(I)I
  #25 = Methodref          #18.#24        //  scala/Predef$.intWrapper:(I)I
  #26 = Utf8               to$extension0
  #27 = Utf8               (II)Lscala/collection/immutable/Range$Inclusive;
  #28 = NameAndType        #26:#27        //  to$extension0:(II)Lscala/collection/immutable/Range$Inclusive;
  #29 = Methodref          #12.#28        //  scala/runtime/RichInt$.to$extension0:(II)Lscala/collection/immutable/Range$Inclusive;
  #30 = Utf8               this
  #31 = Utf8               Ltmp/Demo;
  #32 = Utf8               x
  #33 = Utf8               I
  #34 = Utf8               <init>
  #35 = Utf8               ()V
  #36 = NameAndType        #34:#35        //  "<init>":()V
  #37 = Methodref          #4.#36         //  java/lang/Object."<init>":()V
  #38 = Utf8               scala/collection/immutable/Range$Inclusive
  #39 = Class              #38            //  scala/collection/immutable/Range$Inclusive
  #40 = Utf8               scala/collection/immutable/Range
  #41 = Class              #40            //  scala/collection/immutable/Range
  #42 = Utf8               Inclusive
  #43 = Utf8               Code
  #44 = Utf8               LocalVariableTable
  #45 = Utf8               LineNumberTable
  #46 = Utf8               SourceFile
  #47 = Utf8               InnerClasses
  #48 = Utf8               RuntimeVisibleAnnotations
  #49 = Utf8               ScalaSig
{
  public scala.collection.immutable.Range$Inclusive f(int);
    descriptor: (I)Lscala/collection/immutable/Range$Inclusive;
    flags: ACC_PUBLIC
    Code:
      stack=3, locals=2, args_size=2
         0: getstatic     #16                 // Field scala/runtime/RichInt$.MODULE$:Lscala/runtime/RichInt$;
         3: getstatic     #21                 // Field scala/Predef$.MODULE$:Lscala/Predef$;
         6: iconst_1
         7: invokevirtual #25                 // Method scala/Predef$.intWrapper:(I)I
        10: iload_1
        11: invokevirtual #29                 // Method scala/runtime/RichInt$.to$extension0:(II)Lscala/collection/immutable/Range$Inclusive;
        14: areturn
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      15     0  this   Ltmp/Demo;
            0      15     1     x   I
      LineNumberTable:
        line 4: 3

  public tmp.Demo();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #37                 // Method java/lang/Object."<init>":()V
         4: return
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Ltmp/Demo;
      LineNumberTable:
        line 5: 0
}
Хотя сигнатура метода intWrapper (I)I — как будто int -> int, а RichInt$ — может быть companion object с «статическими методами» (на самом деле методами одного синглетонного экземпляра, что лежит в статическом scala.runtime.RichInt$.MODULE$)
Хз, надо разбираться, может надо это включать, но вот такой класс
class Demo {
  def f(x: Int) = 1 to x
}


у меня компилируется вот в это
public class tmp.Demo {
  public scala.collection.immutable.Range$Inclusive f(int);
    Code:
       0: getstatic     #16  // Field scala/runtime/RichInt$.MODULE$:Lscala/runtime/RichInt$;
       3: getstatic     #21  // Field scala/Predef$.MODULE$:Lscala/Predef$;
       6: iconst_1
       7: invokevirtual #25  // Method scala/Predef$.intWrapper:(I)I
      10: iload_1
      11: invokevirtual #29  // Method scala/runtime/RichInt$.to$extension0:(II)Lscala/collection/immutable/Range$Inclusive;
      14: areturn

  public tmp.Demo();
    Code:
       0: aload_0
       1: invokespecial #37  // Method java/lang/Object."<init>":()V
       4: return
}


т.е. ходят в
@inline implicit def intWrapper(x: Int)         = new runtime.RichInt(x)
/source>
и, судя по всему, возвращаются со свежей ссылкой на RichInt (так как дальше вызывают через invokevirtual)

почему метод называется RichInt$.to$extension0, надо копать.
Мне кажется, это уровень целого «сетевого издательства» или какого-то безумного гения. Отслеживать и публиковать изменения в 3-6 языках (Java, Scala, Clojure, Groovy, JRuby, Jython) с развитой системой фреймворков — это безумный труд. И странная специализация для одного человека.

Я сидел и в java 10 лет, но только местами узнавал, что Log4j2 догнал, а то и перегнал по фичам slf4j, или что асинхронное логирование в Log4J2 сделано на основе сверхбыстродействующего биржевого фреймворка Desruptor.

А остслеживать такое постоянно и на всех «фронтах» — респект такому мозгу!
Спасибо, исправил.
А что Вы имеете в виду под 'дайджестом'?
1) Глубокий обзор фич всех времен и народов («Все что только можно делать c gc, java.lang.references.*, ...», «Все 100500 способов работать с многопоточностью», ...)?
2) Обзор новинок («Все новые трюки с Java 8», «Что нового в Scala 2.11», ...)?
3) Просто новости рынка (по примеру ленты у theserverside.com, infoq.com/java/news/)?
Это, скорее всего, издержки того, что в моей практике устная речь зачастую преобладает над письменной.
Согласен с тем, что от таких «артефактов» стоит избавляться.
1. Опыта промышленной разработки на Scala у меня нет.
2. Опыт использования в промышленных проектах на Java библиотек Akka, Finagle, Netty, Zookeeper — 4+ года.
3. Было бы лучше, если бы преподавал человек с большим опытом на Scala?
Да, было бы лучше.
4. Какое я имею моральное право преподавать курс по Scala?
Этот курс более академический, чем практический. Основан на исследованиях сложных моментов в языке (path dependent types, macroses, generics of higher kind, reflection api, ...) и на возможностях популярных «сложных» библиотек (scalaz, shapeless, algebird). Для эффективности курса такого рода, по моему мнению, важны проработка программы и подбор характерных примеров.
5. Не считаю ли я, что курс был бы круче, если бы его преподавал, скажем, Бурмако?
Скорее всего. Как только он начнет читать курсы по Scala сразу же к нему запишусь.
Курс стоит — 395$.
При оплате группой предусмотрены скидки
2 человека — 695$
3 человека — 995$
Если группа больше — пишите в личку.

Ссылок много, так как я при переходе на Scala и при написании курса проанализировал множество источников.
а изучать JDBC, на мой взгляд, всё равно с какой СУБД

не совсем. Даже при использовании простейших SQL-выражений встает несколько вопросов:
1. Прекращает ли DDL текущую транзакцию (commit)? В MySQL — да, прекращает.
2. Есть ли client-side/server-side prepared statements? У MySQL есть и те и другие и то, какие будут использоваться выставляются свойствами драйвера.
===
Кроме того опыт (даже поверхностный) с MySQL больше ценится на рынке.
В целом сейчас наметился тренд разочарования в MOOC. Одна из причин — все сосредоточились на платформах (низкокачественных, как на взгляд преподавателя), а не на качестве самого материала.
newtonew.com/discussions/trendy-edtech-2014-dorogo-i-nepredskazuemo
«Согласно данным исследования профессора Гарвардского университета Ричарда Меншела, из 80 000 зарегистрировавшихся на девять онлайн-курсов Гарвардского университета завершило курс только 13,3%.»
«Легендарный профессор Принстонского университета Джереми Адельман, один из пионеров среди преподавателей, ведущих онлайн-курсы, в этом году ушёл из Coursera.»
«По результатам опроса, в котором приняло участие 3 000 респондентов из США, проходивших обучение как в чистом онлайн-виде, так и в смешанном, только 15% полностью довольны результатами и большую часть знаний получают именно в онлайне»

И таких данных много. Материал большинства курсов поверхностный, не дает представления о реальной работе в отрасли и т.д.

Мне кажется, что собственники площадок жертвуют «массовости» в ущерб «образованию».

То, что вижу я взаимодействуя с площадками — все хотят материал, но никто не готов платить за него, так как хотя набрать 10к-100к-1000к студентов и учить их бесплатно (странная идея, делать что-то бесплатно, как по мне).

Я же набирая всего 20-30 человек по 400$ имею вполне хороший бюджет на конкретный курс, конкретных студентов.
Но, вообще-то, я пока не видел где-то действительно хороших онлайн-курсов по Java Core. То есть
1. Охватывающий почти все что нужно (аналог 2-х томов Хорстмана)
2. Включающие большое количество тестов и лабораторных
3. Таких, что в случае прохождения 90% тестов/лабораторных можно быть уверенным, что ты знаешь почти все для собеседования.
===
Мне кажется причина в огромном объеме материала. Нужно, что бы новые Хорстманы и Эккели писали курсы под платформы. Нормальный курс должен занимать 50-80 часов видео. Только так можно рассказать чем SoftReference отличается от WeakReference, чем NIO.2 отличается от NIO, как сделать блокирующий буфер с помощью Semaphore и много других вещей, знание которых позволяет чувствовать себя уверенно на собеседовании.
Я присматриваюсь к udemy.com.
Но я не анализировал качество курсов там (по Java порядка 70, кажется).
С точки зрения «полезных»/новых/неизвестных данных — он пустой.
LINQ — это вещь. У нас такое даже не рассматривается.
В Scala вводят какую-то сильную концепцию макросов, будет доступ к AST в момент компиляции, можно делать проверки типов, автогенерацию и прочее.
Наблюдаю перетекание части программистов с Java на Scala — она реально крута. Однако останавливает
1) на Scala мало работы, а это не очень хорошо.
2) на Scala мало фреймворков. Либо используешь Java-стек со стилем Java (Hibernate, JSF, ...) либо сыроватые фреймворки Scala. Т.е. можно из-за одной Akka пописать на Scala, однако современный проект — это десяток фреймворков, а не один.

P.S. Чистое IMHO, наблюдаю друзей, перешедших на Scala, со стороны.
Можете прояснить, что происходит и куда движется платформа в целом?

Ну не берусь говорить о планах Oracle, но я бы отметил следующий моменты:
1. Языковые фичи — это не платформа. И, по моему мнению, они не играют такой значительной роли, какую им приписывают. Скажем лично я перешел с C++ на Java потому, что в моей конторе больше платили за Java (отсутствие перегрузки операторов меня вообще не волновало). Я выбрал Java, а не C# (в то время) потому, что мне казалось, что на Java более открытая экосистема, точнее открыты сорцы всей JDK и я могу не читать MSDN, а просто подключить сорцы к IDE и читать сорцы.
2. Из платформы — введение в Java 7 байткода invokedynamic (java.lang.invoke.*), что открывает возможность написания эффективных языков с динамической типизацией для JVM. Однако, полагаю, что массовым polyglot programming не станет (т.е. смесь из Java/Scala/Groovy/Clojure) из-за сложности ведения такого проекта.
Также при переходе с Collection API на Stream API зачастую происходит жесткий рефакторинг (связанный хотя бы с ленивостью и распараллеливанием стримов), который охватывает не границы классов, а границы целых пакетов.
В итоге найти отдельный содержательный класс с фиксированной функциональностью, который перешел с Java 7 на Java 8 — это отдельная проблема.
Можно и так. Однако, оцените количество импортов именно в этом файле
import backtype.storm.tuple.Fields;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import storm.trident.Stream;
import storm.trident.operation.Aggregator;
import storm.trident.operation.CombinerAggregator;
import storm.trident.operation.ReducerAggregator;
import storm.trident.operation.impl.ChainedAggregatorImpl;
import storm.trident.operation.impl.CombinerAggregatorCombineImpl;
import storm.trident.operation.impl.CombinerAggregatorInitImpl;
import storm.trident.operation.impl.ReducerAggregatorImpl;
import storm.trident.operation.impl.SingleEmitAggregator;
import storm.trident.operation.impl.SingleEmitAggregator.BatchToPartition;
import storm.trident.tuple.ComboList;
И добавьте сюда неимпортированные, но используемые классы из этого же пакета.
Вот с таким количеством сущностей придется столкнуться человеку, читающему сорцы этого класса. Сущностей явно больше 7+-2, которые реально удерживать в голове.

Information

Rating
Does not participate
Registered
Activity