Создать класс, объект которого не может быть создан
Я учусь на бакалавра, и мой профессор дал мне задание, он сказал: "Создать класс без использования модификатора доступа или ключевого слова интерфейса, чей объект не может быть создан".
Я прошел через Google, но не могу найти решение. Как это можно сделать на Java?
5 ответов
Перечисления - это классы ( JLS§8.9), которые не могут быть созданы и не могут быть разделены на подклассы; просто создайте его без каких-либо значений:
enum Foo {}
Другие возможности в зависимости от интерпретации:
JonK и T.J. Crowder рассмотрели возможность исключения из конструктора:
final class Example {
Example() {
throw new Exception();
}
}
Но nick zoum отметил, что экземпляр все еще создается и существует, кратко, до исключения, хотя его нельзя (в примере выше) сохранить.
nick zoum считается abstract
:
abstract class Example {
}
... но T.J. Crowder указал, что abstract
классы могут быть разделены на подклассы (они не могут быть final
), а экземпляр подкласса "является" экземпляром суперкласса.
Я не Java-человек, но другие ответы дали мне эту идею:
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Object o = new Problematic();
// unreachable
}
}
class Problematic
{
static
{
int i = 1 / 0 ;
}
}
Я уверен, что нет никакого способа сделать Problematic
и выжить...
(Обратите внимание, что когда я пытался throw new Exception();
в статическом инициализаторе он не будет компилироваться)
Вы пробовали ключевое слово abstract
?
Например:
abstract class Test{}
Конечно, это может быть перезаписано, поэтому, пожалуйста, проверьте этот ответ для более надежного дизайна.
Анонимный внутренний класс должен быть ответом.
Пример:
public abstract class HelloWorld{
abstract void x();
public static void main(String []args){
System.out.println("Hello World");
HelloWorld h = new HelloWorld(){
void x(){
System.out.println(" ");
}
};
h.x();
}
}
Класс создан, но его имя определяет компилятор, который расширяет HelloWorld
класс и обеспечивает реализацию x()
метод.
Не услышав точно, как ваш профессор сформулировал это, "без использования модификатора доступа" может означать, что они пытаются научить вас, как работает модификатор доступа "по умолчанию"?
В таком случае:
package mypackage.nocreate;
class MyClass {
}
А потом:
package mypackage;
import mypackage.nocreate.MyClass;
public class Test {
public static void main(String[] args) {
new MyClass(); // not allowed - in a different package
}
}
Вы можете утверждать, что - по крайней мере, в исходном коде - который не использует модификатор доступа:)