?

Log in

No account? Create an account
Фишка, которую я хочу в синтаксисе Java: абстрактные константы.… - В мире нет ничего простого — ЖЖ
Август 21, 2011
03:43 pm

[Ссылка]

Previous Entry Поделиться Next Entry

Фишка, которую я хочу в синтаксисе Java: абстрактные константы. Устроено могло бы быть так. В интерфейсе или абстрактном суперклассе - объявление без инициализации:

abstract final Type CONST;

В реализации / подклассе - обязательная (если это не абстрактный класс) инциализация:

@Override
final Type CONST = value;

Такая штука была бы полезна, например, в случае, когда имеется много функционально близких классов, в каждом из которых используется с одной и той же целью константа, имеющая для каждого конкретного класса свое значение (банальный пример: есть множество окон, содержащих вкладки; число вкладок постоянно для окна каждого типа и разное для разных типов - где-то две вкладки, где-то пять, где-то одна... вот число вкладок и хорошо было бы сделать такой константой). Сейчас в таких случаях приходится либо объявлять эту константу только в подклассах (это не позволяет использовать ее в суперклассе, да и просто противоречит принципу наследования), либо объявлять ее в суперклассе не как константу, а инициализировать в подклассах либо в теле использующего его метода, либо отдельным блоком кода, исполняемым при загрузке кода (некрасиво; неэкономно - нельзя сделать неизменяемое значение константой; фактически создает проблему "магических чисел"; главное: оставляет возможность при наследовании забыть о необходимости инициализации, что особенно весело в случае, если речь о примитиве)
Проблем от введения такого синтаксиса придумать не могу. Догадываюсь, впрочем, что я не первый это придумал, так что, вероятно, они есть...

Tags: ,

(1 комментарий | Оставить комментарий)

Comments
 
[User Picture]
From:whitelynx
Date:Август 21, 2011 09:28 pm
(Link)
Проблема в том, что то, что ты описываешь - это не константа :-)
Смотри - константы подставляет компилятор. То есть если ты пишешь
final int C = 5;
int a = C * 10;
компилятор заменяет C на 5, получается int a = 5 * 10;

В твоем случае, допустим, у нас есть код
public abstract class A {
abstract final int CONST;

public int square() {
return CONST * CONST;
}
}

Что должен делать с этой константой компилятор, на что ее заменять? Заменять ее не на что, потому что в разных подклассах CONST может быть разной. Фактически CONST надо заменять на вызов метода. Ну так почему бы тогда не определить абстрактный метод и не переопределить его final-методами в потомках? Компилятор, насколько я знаю, умеет встраивать final-методы (то есть вместо вызова метода встраивать его код непосредственно в тело вызывающего метода), так что с точки зрения производительности тут все не так плохо.

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

Edited at 2011-08-21 21:42 (UTC)
Разработано LiveJournal.com