juan_gandhi: (Default)
[personal profile] juan_gandhi
package com.weird.java;

public interface Untitled1 {
  class XX {
    private String _name;
    public XX(String name) {
      _name = name;
    }
    public String getName() {
      return _name;
    }
  }
}

Date: 2005-02-25 03:06 am (UTC)
From: [identity profile] cruzio.livejournal.com
http://c2.com/cgi/wiki?InterfaceFactories

Date: 2005-02-25 04:44 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Да там бестолковая болтовня, имхо. Лучше б книжки читали, тех же Гофов. Или смолток изучали типа. Ты знаешь смолток? (Я - нет.)

Date: 2005-02-25 05:41 am (UTC)
From: [identity profile] cruzio.livejournal.com
смолток - нет. Так зачем тебе именно интерфейс?

Date: 2005-02-25 07:39 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Ну как - чтобы передавать интерфейс, а инстанциировать что-то конкретное. :)

Date: 2005-02-25 05:00 pm (UTC)
From: [identity profile] 109.livejournal.com
инстанцируется всегда что-то конкретное. признайся, что тебе на самом деле нужно? :-)

Date: 2005-02-25 07:16 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Да я уже понял, что подход неудачный. Я хотел убить (или поймать) двух зайцев: использовать контекстный new вместо factory, и заодно попробовать stipulate functional requirements in the interface. Имхо, ни то, ни то не получается.

Date: 2005-02-25 03:40 am (UTC)
From: [identity profile] anspa.livejournal.com
(потирая руки) вот если б я писал на вашей пративной джаве, я б там такого наворотил...

и про прошлые выпуски журнала: кстати спасибо за деревянную идею (DirTree()) без рекурсии в основной функции. довольно красиво и удобно.

Date: 2005-02-25 04:43 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
:) Спасибо. Я там ещё добавил версию с treePostorder - мало ли кому втемяшится сначала по дереву, а потом уже в корень знить. Скоро на DevX должно выйти.

Date: 2005-02-25 04:30 am (UTC)
From: [identity profile] 109.livejournal.com
looks like meaningless noise polluting concept space.

Date: 2005-02-25 04:40 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
See: it is a mental experiment. I was looking for a way to write factories that would represent a kind of a unverse for the classes they create. Still looking.

Date: 2005-02-25 05:01 am (UTC)
From: [identity profile] 109.livejournal.com
not sure what do you mean by "unverse", but my standard trick these days is
public class A {
  private A(){} // to prevent unauthorized instantiation
  public class Factory: BaseFactory {
    public A GetInstance(){...}
  }
}

All because those lazy bastards couldn't spend an extra week to implement static virtual functions.

Date: 2005-02-25 07:47 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Да, в принципе, этого хватает - у Блока в Коллекциях такие трюки сплошь и рядом. Нет, мне просто хочется понять, нельзя ли со смыслом начать употреблять

Untitled.XX somebody = untitled.new XX("Io mi chiamo nessuno");

где untitled is an instance of a class implementing Untitled, the one that I wanted to call a universe.

Date: 2005-02-25 04:57 pm (UTC)
From: [identity profile] 109.livejournal.com
я так и не понял, в чём идея. хранить имплементацию чего бы то ни было в интерфейсе - это портить концепцию, по-моему.

Date: 2005-02-25 07:17 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
:) А как ты в интерфейсе специфицируешь Set? (ответ: а никак...)

Date: 2005-02-26 04:55 am (UTC)
From: [identity profile] 109.livejournal.com
в каком смысле set? в смысле геттера-сеттера? тогда всё уже придумано. в сишарпе есть properties в интерфейсах, а в дельфи уж и совсем давно они есть. property - это и есть пара геттер-сеттер. ну или просто геттер, если read-only.

Date: 2005-02-26 05:30 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Нет; в джаве есть interface Set; e.g. class HashSet implements Set; comments to the source code "stipulate" that all set elements are different (w.r.t. equals()).

Date: 2005-02-26 05:19 pm (UTC)
From: [identity profile] 109.livejournal.com
что-то я тогда совсем ничего не понимаю. какой смысл ты вкладывал во фразу как ты в интерфейсе специфицируешь Set?

Date: 2005-02-28 04:20 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Каким образом ты определишь с помощью интерфейса такое понятие, как Set, с конкретными классами типа HashSet, LinkedHashSet, and what not?

Date: 2005-02-28 04:38 am (UTC)
From: [identity profile] 109.livejournal.com
интерфейс - это набор сигнатур. ПОНЯТИЕ - это, очевидно, что-то другое. сначала нужно формализовать, что такое ПОНЯТИЕ (например вот понятие Set), а потом думать, какими языковыми средствами это выразить. см. другой тред.

Date: 2005-02-25 05:03 pm (UTC)
From: [identity profile] 109.livejournal.com
а тебе принципиально то, что ты написал, или

Untitled.XX bla = new untitled.XX("bla-bla");

тоже пойдёт?

Date: 2005-02-25 07:18 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Не совсем. Идея была такая, чтобы иметь контекстный new, который бы одновременно изображал из себя фабрику, выглядел бы красиво, и не требовал бы добавления специального метода.

Date: 2005-02-26 04:52 am (UTC)
From: [identity profile] 109.livejournal.com
а что такое контекстный new и чем он отличается от обычного?

Date: 2005-02-26 05:32 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
"Обычный" - статический метод для инстанциируемого класса. Но если класс внутренний, то метод уже не статический, а связан с экземпляром объемлющего класса. Ну и вот. Я думал на такой телеге объехать фабрику.

Date: 2005-02-26 05:15 pm (UTC)
From: [identity profile] 109.livejournal.com
не статический, а связан с экземпляром объемлющего класса

это только в джаве так, и это есть извращение, которое надо забыть как можно скорее, как страшный сон, и уж во всяком случае не использовать это в реальных проектах с участием кумаров.

в сишарпе всё по-человечески: new Outer.Inner();
нужна ссылка на инстанс Outer - заводи члена, не нужна - не заводи.

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

Date: 2005-02-27 04:12 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Я это не считаю извращением. Просто надо смотреть на это по-другому. Смотри, new без контекста - это статический метод. А внутри - он как бы локальный метод. Кроме того, появление возможности дать внутренним классам доступ в локальную вселенную, так сказать, делает язык вообще более объёмным.

Ну и со ссылкой-то понятно; но не хотелось бы рассуждать на уровне пойнтеров, всё-таки 21-й век.

Я не думаю, что причина внутренних классов - отсутствие "указателей на функции" (блин, опять указатели). Скорее я бы сказал, что с функциями в джаве нельзя обращаться как с отдельными сущностями. А где можно?

Ну вот скажи, как бы ты в сишарпе определил класс Set, так чтобы equals() вычислялся правильно, и при этом бы Set оставался интерфейсом (т.е. допускал бы множественное наследование.:)?

А как это сделать в смолтоке?

Я сейчас балуюсь с чем-то таким:

interface Object {
Object template = new Object() {
..........
}
}

хорошо бы понять, до чего хорошего тут можно дойти.

Date: 2005-02-27 05:24 am (UTC)
From: [identity profile] 109.livejournal.com
Скорее я бы сказал, что с функциями в джаве нельзя обращаться как с отдельными сущностями. А где можно?

везде можно. в С++, в Дельфи, в C#. потому что нужно. а джава родилась в мучительном разрыве между попыткой сделать правильно и желанием побыстрее выбросить продукт на рынок. как, впрочем, всё у Сана. если бы не упомянутое желание, в джаве generics бы с самого начала были. а так сколько лет прошло, и сколько кумаров успело набежать?

Ну вот скажи, как бы ты в сишарпе определил класс Set, так чтобы equals() вычислялся правильно, и при этом бы Set оставался интерфейсом (т.е. допускал бы множественное наследование)?

ты неправильно бутеброд ешь. "вычислялся правильно" - это имплементация. а интерфейс, по определению - это отсутствие имплементации. то есть ты ставишь заведомо нерешаемую в рамках имеющейся парадигмы задачу. сломать парадигму и засунуть имплементацию в интерфейс можно, но примерно с той же эффективностью, как лечить боль головы отрубанием оной.

Date: 2005-02-28 04:30 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Видишь ли. В принципе, конечно, да - определяй в интерфейсе лицо, а имплементацию оставь имплементации.

Но имплементация имплементации рознь. Определение equals() относится не к имплементации, а к определению типа. Точно также для списков операция равенства определяется как равенство головы и хвоста. Во всём этом достаточно полиморфизма; просто один только интерфейс задаёт сигнатуры операций, но не задаёт аксиомы. Условия, то есть. Как задавать условия? В принципе, интерфейсы для этого достаточно гибки: в них можно задавать константы. Вот в константах-то я и пытаюсь держать аксиомы. Неправильно - но где такой язык, в котором я мог бы писать правильно? Сишарп? Камл? Хаскел? Я не знаю; скажите мне.

Date: 2005-02-28 04:42 am (UTC)
From: [identity profile] 109.livejournal.com
ну да, но не аксиомы только, а инварианты. "все Set-ы должны удовлетворять..." формализуй, чему должны удовлетворять все сеты - и (может быть) станет ясно, как это положить на язык.

Date: 2005-02-25 06:17 am (UTC)
From: [identity profile] lafy.livejournal.com
Так можно и методы так же определять и все что угодно :)

http://www.javaspecialists.co.za/archive/Issue006.html

Date: 2005-02-25 07:44 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Это забавно, конечно. Поставленную задачу решает. Напоминает "двойные фигурные скобки":

Map map = new HashMap() {{ put("su", "South Ural"); put("za", "Zabaikalie");}};

Пока что я не вижу понта (I don't see the point) поступать именно так. Народ на джава.нет вообще звереет от такого непочтительного отношения. Почему-то в адрес динамических прокси не ругаются.

Я-то просто ищу языковые средства.
From: [identity profile] cruzio.livejournal.com
class Untitled1 {
/**non-static*/ protected class Inner{
}
}

Another file in the same package:
public class Untitled2 {
public static void main(String[] args) {
Untitled1 untitled1 = new Untitled1();
Untitled1.Inner inner= untitled1.new Inner();
}
}

Profile

juan_gandhi: (Default)
Juan-Carlos Gandhi

October 2025

S M T W T F S
    1 23 4
567891011
12131415161718
19202122232425
262728293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Oct. 5th, 2025 11:32 am
Powered by Dreamwidth Studios