2010-11-10 2 views
14

По-прежнему из C++ я нахожу громоздким создание множества небольших вспомогательных классов и объектов. В основном, потому что у меня должен быть один файл для каждого класса. Я в принципе есть класс, как это:Почему только один класс в файле

public class mySimpleClass { 
    public float[] numbers = new float[ 4 ]; 
} 

А потом у меня есть этот класс:

public class myNotSoSimpleClass { 
    private mySimpleClass; 
    . 
    . 
    . 
} 

Второй класс, который не является так просто нормально, чтобы иметь в своем собственном файле. Однако простой класс связан с не очень простым классом, и было бы очень неплохо не иметь эти несколько строк кода в собственном файле.

Так, чтобы подвести итог, это то, что можно было бы сделать в C++:

public class myNotSoSimpleClass { 
    private struct mySimpleClass { 
     float numbers[ 4 ]; 
    } myStruct; 
    . 
    . 
    . 
} 

Можно ли вставлять/использовать один класс внутри другого класса, или тот же файл? Мне просто было бы легче работать с большими проектами, если бы я мог настроить эти два класса в один файл. Или Java - это строго один класс для каждого файла, и это все, язык?

+5

В Java обычно называют все имена классов с прописной буквой и всеми именами переменных с строчной буквой. Вы должны называть свои классы 'MySimpleClass' и' MyNotSoSimpleClass'. –

+1

Почему у вас есть класс, который ничего не делает, кроме wrap array, который также является классом? – JeremyP

+0

@JeremyP: Это пример. Мой простой класс имеет несколько переменных, а мой не очень простой класс имеет гораздо больше кода, включая функции. – Espen

ответ

14

Возможно использование одного класса внутри другого класса. В Java это называется inner class

+0

Что было бы здесь? Использование внутреннего класса для такого класса вспомогательного класса или одного из этих частных классов пакетов? – Espen

+0

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

+1

Внутренние классы - один тип вложенного класса. Существуют также статические вложенные классы. –

3

Java позволяет создавать внутренние классы. То есть, классы внутри другого класса. Здесь вы должны поместить свои вспомогательные классы. С другой стороны, я чувствую вашу боль. Являясь в первую очередь C++-кодером, Java может иногда чувствовать, что он заставляет вас использовать шаблон.

15

Вы можете иметь несколько классов в одном файле, но только один из них может быть публичным:

Java: Multiple class declarations in one file

+0

У вас могут быть общедоступные внутренние классы, что вы пытаетесь сказать? –

+6

Он вообще не относится к внутренним классам, а относится к дополнительным классам верхнего уровня. –

+0

«Только один из них может быть общедоступным» неверен. –

4

Правило один верхнего уровня общественного класса для каждого файла. Внутренний класс, частный класс и некоторые другие вещи разрешены.

+0

-1 Неверный. Ограничение распространяется только на классы верхнего уровня. –

+0

@Erick: Как это делает его ответ неправильным? Он сказал «частный класс», по которому я предполагаю, что он означает класс высшего уровня, который не является публичным. – Jay

+0

Вы можете предположить, потому что вы понимаете, как это работает. Кто-то, кто пытается понять, не может сделать такую ​​же презумпцию. –

5

Ограничение на то, что вы можете иметь только один открытый класс верхнего уровня для каждого файла (хотя вы можете иметь вложенные публичные классы). Как уже упоминалось, у вас могут быть внутренние/вложенные классы внутри этого класса.

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

Вот глава из эффективной Java (которая стоит прочитать) по этому вопросу. http://books.google.co.uk/books?id=ka2VUBqHiWkC&lpg=PA67&ots=yXKoLnv2TX&dq=Minimize%20the%20accessibility%20of%20classes%20and%20members&pg=PA67#v=onepage&q&f=false

+2

Неверный. Вложенные классы могут быть общедоступными. –

+0

А, мои извинения. Забыл об этом случае. Я сделаю редактирование на мой ответ. – Sinjo

+0

Второй абзац по-прежнему неверен. Исправьте это, и я удалю свой downvote. –

0

В Java есть что-то называемое вложенными классами, читайте больше about it here!

+0

-1 Плохой формат ответа. –

2

В Java нет способа разместить два класса классов верхнего уровня в один и тот же файл, но это ограничение не распространяется на частные/внутренние классы. Таким образом, вы могли бы иметь что-то вроде:

public class MyNotSoSimpleClass { 
    private MySimpleClass mySimpleClass = new MySimpleClass(); 

    private class MySimpleClass { 
     public float numbers[4]; 
     ... 
    } 
.... 

}

+1

Это неверно. В одном исходном файле может быть произвольно много открытых классов. В одном файле не может быть более одного класса * верхнего уровня *. –

+0

Очевидно. Таким образом, частные/внутренние классы. Я не говорю, что они одно и то же. Внутренние классы по определению * not * top level ... – nosirrahcd

+0

@ Andy: Очевидно, user468341 говорил о классах верхнего уровня. – chiccodoro

3

Да, вы можете вложить класс внутри другого.

Вопреки многим ответам здесь нет ограничений на общественную видимость.

Вложенные классы включают в себя:

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

Более подробную информацию можно получить в этом Oracle tutorial.

9

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

Чтобы ответить на вопрос «почему», одним из вероятных факторов является то, что он упрощает поиск ваших классов. Если я вижу ссылку в программе для класса Foobar, я сразу же знаю, что она должна либо находиться в том же файле с текущим классом, либо должна находиться в файле с именем Foobar.java. Я могу проверить импорт, чтобы узнать, в каком каталоге он находится.

Когда я работаю над программами на C или C++, я регулярно нахожусь в поиске файлов Windows или Linux grep, чтобы найти источник для класса.

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

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

+1

Время, затрачиваемое на создание нового файла для каждого класса, является крошечным по сравнению с экономией времени, позволяющей находить код без поиска. Вам не нужно просматривать несколько уровней #includes или пытаться вручную проанализировать make-файл, чтобы определить, какой файл имеет этот класс. +1 для объяснения. –

+0

Я вижу смысл иметь один файл для каждого класса. Тем не менее, у меня никогда не было такой проблемы с поиском класса на C++. В основном потому, что я думаю, что делаю правильное имя и пространство имен, а также из-за элегантного меню правой кнопки мыши в VS. Хотя просмотр через std или внешние библиотеки был бы безболезненным. Когда говорится, что по одному файлу каждый из десяти или двадцати трехлинейных классов будет просто хлопот. – Espen

+0

@Espen: Конечно, может показаться глупым создать отдельный файл, чтобы провести один крошечный класс. Но я возвращаюсь к исходному моменту: последовательное правило позволяет легко найти желаемый исходный код. Современные IDE могут помочь, но я не всегда использую IDE для просмотра моего кода. – Jay