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 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-ы должны удовлетворять..." формализуй, чему должны удовлетворять все сеты - и (может быть) станет ясно, как это положить на язык.

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 03:09 pm
Powered by Dreamwidth Studios